home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Taifun / Taifun 148 (1990-08-15)(Ossowski, Stefan)(DE)(PD).zip / Taifun 148 (1990-08-15)(Ossowski, Stefan)(DE)(PD).adf / Source / PenteCalc.s < prev    next >
Text File  |  1990-08-07  |  44KB  |  2,382 lines

  1. ;***********************************
  2. ;*                                 *
  3. ;*             PENTE               *
  4. ;*                                 *
  5. ;*         implemented by          *
  6. ;*           Tis Veugen            *
  7. ;*         NL-Waalre,1988          *
  8. ;*                                 *
  9. ;*    Amiga 500                    *
  10. ;*    file  Pente:PenteCalc.s      *
  11. ;*                                 *
  12. ;***********************************
  13. ;
  14. code
  15.     bra    INITCALC
  16. data
  17. ;
  18. RBRDR = 2    ; reduction border
  19. BRDR  = 3    ; evaluation border
  20. BXDIM = 19
  21. BYDIM = 19
  22. BXMAX = BRDR + BXDIM + BRDR
  23. BYMAX = BRDR + BYDIM + BRDR
  24. BSIZE = BXMAX * BYMAX
  25. EXMAX = BRDR + 1 + BRDR
  26. EYMAX = BRDR + 1 + BRDR
  27. ESIZE = EXMAX * EYMAX
  28.  
  29. rdcsq = -1
  30. brdrsq= -[2*BRDR]
  31. empsq = 0
  32. white = $30
  33. black = $34
  34. whbl  = white!black    ; white OR black
  35.  
  36. NOMV  = -1
  37. KPLY  = 16        ; number of plies per move-generation
  38. NPLY  = 128        ; number of plies per game
  39. KMOVS = BXDIM*BYDIM    ; number of moves per position
  40. NMOVS = KPLY*KMOVS/2    ; total number of moves/2
  41.  
  42. TableCLEN  = $10000
  43. TableEVLEN = $20000
  44. TableLEN   = TableCLEN + TableEVLEN
  45.  
  46. TakeBit = 9    ; Evaluation taken stones = 2^TakeBit
  47.  
  48. ZCEVI = -$7800
  49. ZAEVI =  ZCEVI
  50. ZBEVI = -ZAEVI
  51. ZWIN  =  $5800
  52. ZBEV  =  $0001
  53.  
  54. ;    History
  55. HcolME = 0
  56. HcolOP = HcolME + 2
  57. HWEVBRD= HcolOP + 2
  58. HBEVBRD= HWEVBRD + 4
  59. HTGMV  = HBEVBRD + 4
  60. HPLYNR = HTGMV + 4
  61. HWIN   = HPLYNR + 2
  62. HWMEV  = HWIN + 2
  63. HBMEV  = HWMEV + 1
  64. HPEV   = HBMEV + 1
  65. HAEV   = HPEV + 2
  66. HBEV   = HAEV + 2
  67. HCEV   = HBEV + 2
  68. HMV0   = HCEV + 2
  69. HMV1   = HMV0 + 4
  70. HMV2   = HMV1 + 4
  71. HTQS   = HMV2 + 4
  72. HRCP   = HTQS + 1 + 1
  73. ; this part only for game-history
  74. HSBRD  = HRCP + 4
  75. HPEV0  = HSBRD + 4
  76. HPEV1  = HPEV0 + 2
  77. LHST   = HPEV1 + 2
  78. ;
  79. ;    Move
  80. MPEV0  = 0
  81. MPEV   = 2
  82. MSQ    = 4
  83. MTK    = 6
  84. MMEV   = 7
  85. LMOV   = 8
  86. MTQS   = 2
  87. ;
  88. ;    PSN
  89. PXA     = 0        ; help-array
  90. PYA     = PXA + BXMAX    ; help-array
  91. PXMAX   = PYA + BXMAX
  92. PYMAX   = PXMAX + 4
  93. PXDIM   = PYMAX + 4
  94. PYDIM   = PXDIM + 2
  95. PXLO1   = PYDIM + 2
  96. PYLO1   = PXLO1 + 2
  97. PXHI1   = PYLO1 + 2
  98. PYHI1   = PXHI1 + 2
  99. RXLO    = PYHI1 + 2
  100. RXLO1   = RXLO  + 2
  101. RXLO2   = RXLO1 + 2
  102. RYLO    = RXLO2 + 2
  103. RYLO1   = RYLO  + 2
  104. RYLO2   = RYLO1 + 2
  105. RXHI    = RYLO2 + 2
  106. RXHI1   = RXHI  + 2
  107. RXHI2   = RXHI1 + 2
  108. RYHI    = RXHI2 + 2
  109. RYHI1   = RYHI  + 2
  110. RYHI2   = RYHI1 + 2
  111. RXDIM   = RYHI2 + 2
  112. RYDIM   = RXDIM + 2
  113. REBRD   = RYDIM + 2
  114. PRDC    = REBRD + 2
  115. PROW    = PRDC + 2
  116. PCOL    = PROW + 2
  117. PMEV    = PCOL + 2
  118. PPLYCNT = PMEV  + 2
  119. PGMVS   = PPLYCNT + 2    ; Pointer to moves to be generated (A6)
  120. PMEVLIM = PGMVS + 4    ; Limit number taken pairs of stones
  121. PMVAL   = PMEVLIM + 2    ; (positional) Evaluation of taken stone
  122. PESC    = PMVAL + 2    ; escape Evaluation
  123. PTQS    = PESC + 2    ; allowed QS-code
  124. PIQS    = PTQS + 2    ; integral QS-code
  125. PMTQS   = PIQS + 2    ; previous move's QS-code
  126. PREGS   = PMTQS + 2    ; all registers at start-up
  127. PREG0   = PREGS + 64    ; cleared data
  128. PEVPAT  = PREG0 + 32        ; Pev pattern
  129. RWEVBRD = PEVPAT + ESIZE + 1    ; Pointer reduced Pev board white
  130. RBEVBRD = RWEVBRD + 4        ; Pointer reduced Pev board black
  131. WHEVBRD = RBEVBRD + 4        ; Pev board white
  132. BLEVBRD = WHEVBRD + BSIZE    ; Pev board black
  133. RPBRD   = BLEVBRD + BSIZE    ; Pointer reduced Pev board white
  134. PBRD    = RPBRD + 4        ; position board
  135. PTableC = PBRD + BSIZE + 1    ; table of Codes
  136. PTableEV= PTableC + 4        ; table of Evaluations
  137. PHST    = PTableEV + 4        ; A4
  138. PMVS    = PHST + [ NPLY * LHST ]
  139. PTable  = PMVS + [ NMOVS * LMOV ]
  140. LPSN    = PTable + TableLEN
  141. ;
  142. ; bit patterns :
  143. ;
  144. PATempty  = %00
  145. PATwhite  = %01
  146. PATblack  = %10
  147. PATborder = %11
  148. ;
  149. ; codes :
  150. ;
  151. EVC5   = %10000000    ; pente
  152. EVCn   = %01000000    ; normal move
  153. EVC5t  = %00100000    ; pente threat
  154. EVC5s  = %00010000    ; pente threat solved
  155. EVCtkt = %00001000    ; take threat
  156. EVCtks = %00000100    ; take threat solved
  157. EVCtkl = %00000010    ; take left
  158. EVCtkr = %00000001    ; take right
  159. EVCs5t = %10010011    ; mask for solving pente threat
  160. EVCrds = %10110011    ; mask for reduced moves (no take solve)
  161. EVCrdt = %10110111    ; mask for reduced moves (no take threat)
  162. EVCrdn = %10111111    ; mask for reduced moves (no normal)
  163. EVCall = %11111111    ; mask for all moves
  164. EVCQSI = %00101000    ; mask for QS initialization
  165. ;
  166. EVCbit5s = 4        ; bit 4 indicates pente solve
  167. EVCbit5t = 5        ; bit 5 indicates pente threat
  168. EVCbitn  = 6        ; bit 6 indicates normal move
  169. ;
  170. JEVesc =  4
  171. JEVs5t =  8
  172. JEVrds = 12
  173. JEVrdt = 16
  174. JEVrdn = 20
  175. JEVall = 24
  176. JQSesc = 28
  177. JQSs5t = 32
  178. JQSrds = 36
  179. JQSrdt = 40
  180. JQSrdn = 44
  181. JQSall = 48
  182. JEVQSmax = 52
  183. ;
  184. code
  185. ;
  186. DIRS:    dc.w    1,BXMAX+1,BXMAX,BXMAX-1,-1,-BXMAX-1,-BXMAX,-BXMAX+1,0
  187. ;
  188. DPEVPAT:
  189.     dc.b     3,  1,  2,  4,  2,  1,  3
  190.     dc.b     1,  7,  5,  8,  5,  7,  1
  191.     dc.b     2,  5,  1,  1,  1,  5,  2
  192.     dc.b     4,  8,  1,  0,  1,  8,  4
  193.     dc.b     2,  5,  1,  1,  1,  5,  2
  194.     dc.b     1,  7,  5,  8,  5,  7,  1
  195.     dc.b     3,  1,  2,  4,  2,  1,  3
  196. ;
  197. ZRCPcode:
  198.     dc.b    JEVall,JQSrdn,JQSrdt,JQSrds
  199.     dc.b    JQSrds,JQSrds,JQSrds,JQSrds
  200.     dc.b    JQSrds,JQSrds,JQSrds,JQSrds
  201.     dc.b    JQSrds,JQSrds,0,0
  202.     even
  203. ZRCPSR:
  204.     dc.l    ZEVesc
  205.     dc.l    ZEVesc, ZEV,    ZEV,    ZEV,    ZEV,    ZEV
  206.     dc.l    ZQSesc, ZQS,    ZQS,    ZQS,    ZQS,    ZQS
  207.     dc.l    EVCall    ; offset=JEVQSmax
  208.     dc.l    EVCall, EVCs5t, EVCrds, EVCrdt, EVCrdn, EVCall
  209.     dc.l    EVCall, EVCs5t, EVCrds, EVCrdt, EVCrdn, EVCall
  210. ;
  211. RCPescape:    ; subroutine for escape,
  212.         ; to be called by high-level program
  213.     lea    MIRQPort(PC),A0    ; read message
  214.     move.l    ExecBase,A6
  215.     jsr    GetMsg(A6)
  216.     move.l    D0,-(SP)
  217. ;
  218.     moveq    #0,D1        ; clear MIRQ-signal
  219.     lea    TM_sigBit(PC),A0
  220.     move.b    (A0),D0
  221.     bset    D0,D1
  222.     moveq    #0,D0
  223.     move.l    ExecBase,A6
  224.     jsr    SetSignal(A6)
  225. ;
  226.     move.l    (SP)+,A1
  227.     cmpi.w    #CMD_Escape,QIcmd(A1)
  228.     bne.s    RCPstrategy
  229.     lea    RCPMIRQesc(PC),A0
  230.     move.l    (A0),D0        ; D0=address(ZEVesc)
  231.     lea    RCPMIRQA4(PC),A0
  232.     move.l    (A0),A0        ; A0 points to A4-0
  233. RCPescL:
  234.     move.l    D0,HRCP(A0)
  235.     lea    LHST(A0),A0
  236.     tst.l    HRCP(A0)
  237.     bne.s    RCPescL
  238.     rts
  239. ;
  240. RCPstrategy:
  241.     cmpi.w    #CMD_Strategy,QIcmd(A1)
  242.     bne.s    RCPerror
  243.     move.l    QIstrat(A1),A0
  244.     lea    ZRCPcode(PC),A2
  245. RCPstratL:
  246.     move.w    (A0)+,D0
  247.     move.b    D0,(A2)+
  248.     bne.s    RCPstratL
  249. RCPerror:
  250.     rts
  251. ;
  252. RCPMIRQA4:
  253.     dc.l    0    ; used as store for A4-0
  254. RCPMIRQesc:
  255.     dc.l    0    ; used as store for ZEVesc
  256. ;
  257. data
  258.     QLmsg     = 20
  259.     Qcmd      = QLmsg
  260.     Qstatus   = Qcmd + 2
  261.     Qmovenr   = Qstatus + 2
  262.     Qrow      = Qmovenr + 2
  263.     Qcol      = Qrow + 2
  264.     Qtakes    = Qcol + 2
  265.     QmevPL    = Qtakes + 2
  266.     QmevAM    = QmevPL + 2
  267.     Qresult   = QmevAM + 2
  268.  
  269.     QIcmd     = QLmsg
  270.     QIstrat   = QIcmd + 2
  271.  
  272.     IPROG     =  4    ; cmd's
  273.     IGAME     =  8
  274.     DOMV      = 12
  275.     CAMV      = 16
  276.     EPROG     = 20
  277.     ECALC     = 24
  278.  
  279.     CMD_Escape   =  4
  280.     CMD_Strategy =  8
  281.  
  282.     RESULT_OK     = 0
  283.     RESULT_WIN    = 1
  284.  
  285.     status_OK     =  0
  286.     status_ERROR  =  1
  287.  
  288.     NT_INTERRUPT  = 2
  289.     NT_MSGPORT    = 4
  290.     PA_SIGNAL     = 0
  291.     PA_SOFTINT    = 1
  292.     MEMF_CLEAR    = $10000
  293.     MODE_OLD      = 1005
  294.     MODE_NEW      = 1006
  295.  
  296.     ExecBase    = 4
  297.     OpenLib     = -552
  298.     CloseLib    = -414
  299.     Open        =  -30
  300.     Close       =  -36
  301.     Read        =  -42
  302.     Write       =  -48
  303.     Output      =  -60
  304.     Execute     = -222
  305.     AllocMem    = -198
  306.     FreeMem     = -210
  307.     FindTask    = -294
  308.     SetSignal   = -306
  309.     AllocSignal = -330
  310.     FreeSignal  = -336
  311.     AddPort     = -354
  312.     RemPort     = -360
  313.     PutMsg      = -366
  314.     GetMsg      = -372
  315.     ReplyMsg    = -378
  316.     WaitPort    = -384
  317.     FindPort    = -390
  318. code
  319. ;
  320. MsgPTR:    dc.l    0
  321. ;
  322. PC_name:
  323.     dc.b    "PenteCalc",0
  324.     even
  325. PM_name:
  326.     dc.b    "PenteMIRQ",0
  327.     even
  328. INITCALC:
  329.     lea    PC_name(PC),A1
  330.     move.l    ExecBase,A6
  331.     jsr    FindPort(A6)
  332.     tst.l    D0
  333.     bne    ENDCALCSGNL
  334. ;
  335.     moveq    #-1,D0        ; Port Signal
  336.     move.l    ExecBase,A6
  337.     jsr    AllocSignal(A6)
  338.     lea    TC_sigBit(PC),A0
  339.     move.b    D0,(A0)
  340.     cmpi.b    #-1,D0
  341.     beq    ENDCALCSGNL
  342. ;
  343.     suba.l    A1,A1
  344.     move.l    ExecBase,A6
  345.     jsr    FindTask(A6)
  346.     lea    TC_SigTask(PC),A0
  347.     move.l    D0,(A0)
  348. ;
  349.     lea    CalcPort(PC),A1
  350.     move.l    ExecBase,A6
  351.     jsr    AddPort(A6)
  352. ;
  353. INITMIRQ:
  354.     lea    RCPescape(PC),A0
  355.     lea    TMi_Code(PC),A1
  356.     move.l    A0,(A1)
  357. ;
  358.     lea    PM_name(PC),A1
  359.     move.l    ExecBase,A6
  360.     jsr    FindPort(A6)
  361.     tst.l    D0
  362.     bne    ENDMIRQSGNL
  363. ;
  364.     moveq    #-1,D0        ; Port Signal
  365.     move.l    ExecBase,A6
  366.     jsr    AllocSignal(A6)
  367.     lea    TM_sigBit(PC),A0
  368.     move.b    D0,(A0)
  369.     cmpi.b    #-1,D0
  370.     beq    ENDMIRQSGNL
  371. ;
  372.     lea    MIRQinterrupt(PC),A0
  373.     lea    TM_SigTask(PC),A1
  374.     move.l    A0,(A1)
  375. ;
  376.     lea    MIRQPort(PC),A1
  377.     move.l    ExecBase,A6
  378.     jsr    AddPort(A6)
  379. ;
  380.     lea    QSst(PC),A0
  381.     clr.w    (A0)
  382. ;
  383. MAINL:    move.l    A6,-(SP)
  384.     lea    CalcPort(PC),A0
  385.     move.l    ExecBase,A6
  386.     jsr    WaitPort(A6)
  387. ;
  388.     lea    CalcPort(PC),A0
  389.     move.l    ExecBase,A6
  390.     jsr    GetMsg(A6)
  391.     lea    MsgPTR(PC),A0
  392.     move.l    D0,(A0)
  393.     move.l    (SP)+,A6
  394. ;
  395.     move.l    D0,A0
  396.     move.w    Qcmd(A0),D0
  397.     cmpi.w    #ECALC,D0
  398.     beq.s    QSECALC
  399. ;
  400.     lea    QSUBS(PC),A1
  401.     move.l    0(A1,D0.w),A1
  402.     jsr    (A1)
  403. ;
  404.     bra.s    MAINL
  405. ;
  406. GETMSGPTR: macro
  407.     lea    MsgPTR(PC),A0
  408.     move.l    (A0),A1
  409.     endm
  410. ;
  411. QSECALC:
  412.     moveq    #status_ERROR,D0
  413.     lea    QSst(PC),A0
  414.     tst.w    (A0)
  415.     bne.s    ENDCALCERR
  416.     GETMSGPTR
  417.     move.w    #status_OK,Qstatus(A1)
  418.     move.l    ExecBase,A6
  419.     jsr    ReplyMsg(A6)
  420. ENDCALC:
  421.     bsr    SUBENDCALC
  422. ENDMIRQSGNL:
  423.     bsr    SUBENDMIRQ
  424. ENDCALCSGNL:
  425.     moveq    #0,D0
  426. ENDCALCERR:
  427.     rts
  428. ;
  429. SUBENDCALC:
  430.     lea    CalcPort(PC),A1
  431.     move.l    ExecBase,A6
  432.     jsr    RemPort(A6)
  433. ;
  434. SUBENDCALCPORT:
  435.     lea    TC_sigBit(PC),A0
  436.     move.b    (A0),D0
  437.     move.l    ExecBase,A6
  438.     jsr    FreeSignal(A6)
  439.     rts
  440. ;
  441. SUBENDMIRQ:
  442.     lea    MIRQPort(PC),A1
  443.     move.l    ExecBase,A6
  444.     jsr    RemPort(A6)
  445. ;
  446. SUBENDMIRQPORT:
  447.     lea    TM_sigBit(PC),A0
  448.     move.b    (A0),D0
  449.     move.l    ExecBase,A6
  450.     jsr    FreeSignal(A6)
  451.     rts
  452. ;
  453. QSUBS:    dc.l    0,QSIPROG,QSIGAME,QSDOMV,QSCAMV,QSEPROG,QSECALC
  454. QSst:    dc.w    0
  455. ;
  456. QSIPROG:
  457.     moveq    #status_ERROR,D0
  458.     lea    QSst(PC),A0
  459.     tst.w    (A0)
  460.     bne.s    QSREPLYs
  461.     bsr    INITPROG
  462.     cmpi.w    #status_OK,D0
  463.     bne.s    QSREPLYs
  464.     lea    QSst(PC),A0
  465.     move.w    #1,(A0)
  466. QSREPLYs:
  467.     GETMSGPTR
  468.     move.w    D0,Qstatus(A1)
  469. ;
  470. QSREPLY:
  471.     move.l    A6,-(SP)
  472.     move.l    ExecBase,A6
  473.     jsr    ReplyMsg(A6)
  474.     move.l    (SP)+,A6
  475.     rts
  476. ;    
  477. CKQSst:    macro
  478.     moveq    #status_ERROR,D0
  479.     lea    QSst(PC),A0
  480.     tst.w    (A0)
  481.     beq.s    QSREPLYs
  482.     endm
  483. ;
  484. QSEPROG:
  485.     CKQSst
  486.     bsr    ENDPROG
  487.     cmpi.w    #status_OK,D0
  488.     bne.s    QSREPLYs
  489.     lea    QSst(PC),A0
  490.     clr.w    (A0)
  491.     bra.s    QSREPLYs
  492. ;
  493. QSIGAME:
  494.     CKQSst
  495.     bsr    INITGAME
  496.     bra.s    QSREPLYs
  497. ;
  498. QSDOMV:    CKQSst
  499.     bsr    CHECKMOVENR
  500.     bne.s    QSRTMV        ; error!
  501.     GETMSGPTR
  502.     move.w    Qrow(A1),PROW(A3)
  503.     move.w    Qcol(A1),PCOL(A3)
  504.     bsr    DOEMOVE
  505.     move.l    HMV0(A4),A6
  506.     bra.s    QSRTMV
  507. ;
  508. QSCAMV:    CKQSst
  509.     bsr    CHECKMOVENR
  510.     bne.s    QSRTMV        ; error!
  511.     move.w    #-1,PRDC(A3)    ; reduce
  512.     bsr    INITMOVE
  513.     bsr    CALCMOVE
  514.     bsr    EXECMOVE
  515.     bsr    GETMOVE
  516.     moveq    #status_OK,D0
  517. QSRTMV:
  518.     GETMSGPTR
  519.     move.w    D0,Qstatus(A1)
  520.     move.w    PROW(A3),Qrow(A1)
  521.     move.w    PCOL(A3),Qcol(A1)
  522. ;
  523.     moveq    #RESULT_OK,D0
  524.     move.w    HWIN(A4),D1
  525.     cmp.w    HPEV1(A4),D1
  526.     bne.s    QSRTMVR
  527.     moveq    #RESULT_WIN,D0
  528. QSRTMVR:
  529.     move.w    D0,Qresult(A1)
  530. ;
  531.     moveq    #0,D0
  532.     move.b    MMEV(A6),D0
  533.     move.w    D0,QmevAM(A1)
  534.     move.b    HBMEV(A4),D0
  535.     move.w    D0,QmevPL(A1)
  536.     move.b    MTK(A6),D0
  537.     move.w    D0,Qtakes(A1)
  538.     bra    QSREPLY
  539. ;
  540. GETMOVE:
  541.     move.l    HMV0(A4),A6    ; calculate position according to
  542.     moveq    #0,D7
  543.     move.w    MSQ(A6),D7    ; normal board
  544.     divu    D3,D7
  545.     add.w    RYLO(A3),D7
  546.     subq.w    #BRDR,D7
  547.     move.w    D7,PROW(A3)
  548.     swap    D7
  549.     add.w    RXLO(A3),D7
  550.     subq.w    #BRDR,D7
  551.     move.w    D7,PCOL(A3)
  552.     rts
  553. ;
  554. CHECKMOVENR:
  555.     GETMSGPTR
  556.     move.w    Qmovenr(A1),D0
  557.     cmp.w    HPLYNR(A4),D0
  558.     beq.s    CHECKMOVENROK
  559.     bgt.s    CHECKMOVENRERR
  560.     move.w    D0,-(SP)
  561.     bsr    EXECBACK
  562.     move.w    (SP)+,D0
  563.     bra.s    CHECKMOVENRN
  564. CHECKMOVENRL:
  565.     move.w    D0,-(SP)
  566.     bsr    BACKMOVE
  567.     move.w    (SP)+,D0
  568. CHECKMOVENRN:
  569.     cmp.w    HPLYNR(A4),D0
  570.     blt.s    CHECKMOVENRL
  571. CHECKMOVENROK:
  572.     moveq    #status_OK,D0
  573.     rts
  574. CHECKMOVENRERR:
  575.     moveq    #status_ERROR,D0
  576.     rts
  577. ;
  578. PTRDOS:
  579.     dc.l    0
  580. PTRFILEH:
  581.     dc.l    0
  582. DosName:
  583.     dc.b    "dos.library",0
  584.     even
  585. NameTable:
  586.     dc.b    "Pente:PenteTable",0
  587.     even
  588. StringExecTable:
  589.     dc.b    "Pente:PenteCalcTable",0
  590.     even
  591. ;
  592. INITOPEN:
  593.     move.l    PTRDOS(PC),A6
  594.     lea    NameTable(PC),A0
  595.     move.l    A0,D1
  596.     move.l    #MODE_OLD,D2
  597.     jsr    Open(A6)
  598.     lea    PTRFILEH(PC),A0
  599.     move.l    D0,(A0)
  600.     rts
  601. ;
  602. INITPROG:
  603.     move.l    ExecBase,A6
  604.     lea    DosName(PC),A1
  605.     moveq    #0,D0
  606.     jsr    OpenLib(A6)
  607.     lea    PTRDOS(PC),A0
  608.     move.l    D0,(A0)
  609.     beq    INITPROGERDOS
  610. ;
  611.     bsr    INITOPEN
  612.     bne.s    INITPROGREAD
  613.     move.l    PTRDOS(PC),A6
  614.     lea    StringExecTable(PC),A0
  615.     move.l    A0,D1
  616.     moveq    #0,D2
  617.     moveq    #0,D3
  618.     jsr    Execute(A6)
  619.     bsr    INITOPEN
  620.     beq    INITPROGERFO
  621. INITPROGREAD:
  622.     move.l    #LPSN,D0
  623.     move.l    #MEMF_CLEAR,D1
  624.     move.l    ExecBase,A6
  625.     jsr    AllocMem(A6)
  626.     move.l    D0,A3
  627.     beq    INITPROGERFO
  628. ;
  629.     move.l    A3,A0
  630.     adda.l    #PTable,A0
  631.     move.l    A0,PTableC(A3)
  632.     adda.l    #TableCLEN,A0
  633.     move.l    A0,PTableEV(A3)
  634. ;
  635.     move.l    PTRDOS(PC),A6
  636.     move.l    PTRFILEH(PC),D1
  637.     move.l    PTableC(A3),D2
  638.     move.l    #TableLEN,D3
  639.     jsr    Read(A6)
  640. ;
  641.     move.l    PTRDOS(PC),A6
  642.     move.l    PTRFILEH(PC),D1
  643.     jsr    Close(A6)
  644. ;
  645.     lea    PHST(A3),A4
  646.     lea    PBRD(A3),A5
  647.     lea    PMVS(A3),A6
  648. ;
  649.     move.w    #BXDIM,PXDIM(A3)
  650.     move.w    #BYDIM,PYDIM(A3)
  651.     move.l    #BXMAX,PXMAX(A3)
  652.     move.l    #BYMAX,PYMAX(A3)
  653. ;
  654.     move.w    #5,PMEVLIM(A3)
  655.     moveq    #TakeBit,D0
  656.     moveq    #0,D1
  657.     bset    D0,D1
  658.     move.w    D1,PMVAL(A3)
  659. ;
  660.     lea    DPEVPAT(PC),A0
  661.     lea    PEVPAT(A3),A1
  662.     moveq    #ESIZE-1,D0
  663. INITPROGPAT:
  664.     move.b    (A0)+,(A1)+
  665.     dbra    D0,INITPROGPAT
  666. ;
  667.     moveq    #black,D1    ; black/white indication
  668.     swap    D1
  669.     move.w    #white,D1
  670.     moveq    #0,D2        ; ply count
  671.     lea    TWGMV(PC),A0    ; WTable pair of bits
  672.     move.l    A0,D5
  673.     lea    TBGMV(PC),A0    ; BTable pair of bits
  674.     move.l    A0,D4
  675.     move.l    A4,A0
  676.     moveq    #NPLY-1,D0
  677. INITPROGHSTL:
  678.     move.l    D1,HcolME(A0)
  679.     swap    D1
  680.     move.w    D2,HPLYNR(A0)
  681.     move.w    #ZWIN,D3
  682.     sub.w    D2,D3
  683.     move.w    D3,HWIN(A0)
  684.     addq.w    #1,D2
  685.     move.l    D4,HTGMV(A0)
  686.     exg    D4,D5
  687.     lea    LHST(A0),A0
  688.     dbra    D0,INITPROGHSTL
  689. ;
  690.     lea    ZEVesc(PC),A0    ; interface to interrupt-routine
  691.     lea    RCPMIRQesc(PC),A1
  692.     move.l    A0,(A1)
  693. ;
  694.     movem.l    PREG0(A3),D0-D7    ; clear data-registers
  695.     movem.l    A0-A7/D0-D7,PREGS(A3)
  696.     moveq    #status_OK,D0
  697.     rts
  698. ;
  699. INITPROGERFO:
  700.     bsr    ENDPROGDOS
  701. INITPROGERDOS:
  702.     moveq    #status_ERROR,D0
  703.     rts
  704. ;
  705. ENDPROG:
  706. ENDPROGPSN:
  707.     move.l    A3,A1
  708.     move.l    #LPSN,D0
  709.     move.l    ExecBase,A6
  710.     jsr    FreeMem(A6)
  711. ENDPROGDOS:
  712.     move.l    ExecBase,A6
  713.     move.l    PTRDOS(PC),A1
  714.     jsr    CloseLib(A6)
  715. ENDPROGE:
  716.     moveq    #status_OK,D0
  717.     rts
  718. ;
  719. CalcPort:
  720. TC_Node_Succ:    dc.l    0
  721. TC_Node_Pred:    dc.l    0
  722. TC_Node_Type:    dc.b    NT_MSGPORT
  723. TC_Node_Pri:    dc.b    0
  724. TC_Node_Name:    dc.l    PC_name
  725. TC_Flags:    dc.b    PA_SIGNAL
  726. TC_sigBit:    dc.b    0
  727. TC_SigTask:    dc.l    0
  728. TC_lh_Head:    dc.l    0
  729. TC_lh_Tail:    dc.l    0
  730. TC_lh_TailPred:    dc.l    0
  731. TC_lh_Type:    dc.b    0
  732. TC_lh_pad:    dc.b    0
  733. ;
  734. MIRQPort:
  735. TM_Node_Succ:    dc.l    0
  736. TM_Node_Pred:    dc.l    0
  737. TM_Node_Type:    dc.b    NT_MSGPORT
  738. TM_Node_Pri:    dc.b    0
  739. TM_Node_Name:    dc.l    PM_name
  740. TM_Flags:    dc.b    PA_SOFTINT
  741. TM_sigBit:    dc.b    0
  742. TM_SigTask:    dc.l    MIRQinterrupt
  743. TM_lh_Head:    dc.l    0
  744. TM_lh_Tail:    dc.l    0
  745. TM_lh_TailPred:    dc.l    0
  746. TM_lh_Type:    dc.b    0
  747. TM_lh_pad:    dc.b    0
  748. ;
  749. MIRQinterrupt:
  750. TMi_Node_Succ:    dc.l    0
  751. TMi_Node_Pred:    dc.l    0
  752. TMi_Node_Type:    dc.b    NT_INTERRUPT
  753. TMi_Node_Pri:    dc.b    16
  754. TMi_Node_Name:    dc.l    0
  755. TMi_Data:    dc.l    0
  756. TMi_Code:    dc.l    RCPescape
  757. ;
  758. DUMMY_MOVE:
  759.     move.l    A6,HMV0(A4)
  760.     move.w    #-1,MSQ(A6)
  761.     clr.b    MMEV(A6)
  762.     clr.w    MPEV0(A6)
  763.     lea    LMOV(A6),A6
  764.     move.l    A6,HMV2(A4)
  765.     move.l    A6,PGMVS(A3)
  766.     rts
  767. ;
  768. INITGAME:
  769.     movem.l    PREGS(A3),A0-A7/D0-D7
  770.     move.l    A6,PGMVS(A3)
  771. ;
  772.     move.w    #BRDR-1,PXLO1(A3)
  773.     move.w    #BRDR-1,PYLO1(A3)
  774.     move.w    PXDIM(A3),PXHI1(A3)
  775.     addi.w    #BRDR,PXHI1(A3)
  776.     move.w    PYDIM(A3),PYHI1(A3)
  777.     addi.w    #BRDR,PYHI1(A3)
  778.  
  779.     move.l    PXMAX(A3),D3
  780.     lea    DIRS(PC),A0    ; fill DIRS
  781.     moveq    #1,D0
  782.     move.w    D0,(A0)+
  783.     add.w    D3,D0
  784.     move.w    D0,(A0)+
  785.     subq.w    #1,D0
  786.     move.w    D0,(A0)+
  787.     subq.w    #1,D0
  788.     move.w    D0,(A0)+
  789.     moveq    #-1,D0
  790.     move.w    D0,(A0)+
  791.     sub.w    D3,D0
  792.     move.w    D0,(A0)+
  793.     addq.w    #1,D0
  794.     move.w    D0,(A0)+
  795.     addq.w    #1,D0
  796.     move.w    D0,(A0)+
  797.     clr.w    (A0)
  798. ;
  799.     bsr    INITBRD
  800.     move.l    PGMVS(A3),A6
  801.     bsr    DUMMY_MOVE
  802. ;
  803.     moveq    #status_OK,D0
  804. INITGAMEE:
  805.     rts
  806. ;
  807. INITMOVE:
  808.     lea    LHST(A4),A4    ; increment A4
  809.     tst.w    PRDC(A3)
  810.     beq.s    INITMOVEBA    ; skip RDC ?
  811.     bsr    RDCSIZE        ; also determines start RDCboard
  812.     bsr    INRDC
  813.     bra.s    INITMOVERDC
  814. INITMOVEBA:
  815.     move.w    #BRDR,RXLO(A3)
  816.     move.w    #BRDR,RYLO(A3)
  817.     move.w    PXDIM(A3),RXDIM(A3)
  818.     move.w    PYDIM(A3),RYDIM(A3)
  819.     bsr    BRDADDS
  820. INITMOVERDC:
  821.     lea    RCPMIRQA4(PC),A0    ; interface to interrupt-routine
  822.     move.l    A4,(A0)
  823. ;
  824.     move.l    A4,A0        ; fill History with Pointers
  825.     move.w    #NPLY-1,D7
  826.     sub.w    HPLYNR(A0),D7    ; Maximum available moves
  827. ;
  828.     move.l    RWEVBRD(A3),D0
  829.     move.l    RBEVBRD(A3),D1
  830.     cmpi.w    #white,HcolME(A0)
  831.     beq.s    INITMOVEHSTL
  832.     exg    D0,D1
  833. INITMOVEHSTL:
  834.     move.l    D0,HWEVBRD(A0)
  835.     move.l    D1,HBEVBRD(A0)
  836.     exg    D0,D1
  837.     lea    LHST(A0),A0
  838.     dbra    D7,INITMOVEHSTL
  839. ;
  840.     move.l    A4,A2    ; initialize recipes
  841.     lea    ZRCPcode(PC),A0
  842.     lea    ZRCPSR(PC),A1
  843.     moveq    #TakeBit,D0
  844.     moveq    #0,D1
  845.     bset    D0,D1
  846.     lsr.l    #1,D1
  847.     move.w    D1,PESC(A3)
  848.     moveq    #0,D0
  849. INITMOVESRL:
  850.     move.b    (A0)+,D0
  851.     move.l    0(A1,D0.w),HRCP(A2)
  852.     move.l    JEVQSmax(A1,D0.w),D1
  853.     move.b    D1,HTQS(A2)
  854.     lea    LHST(A2),A2
  855.     neg.w    PESC(A3)
  856.     tst.b    D0
  857.     bgt.s    INITMOVESRL
  858.     clr.l    HRCP(A2)    ; stop-indication for MIRQ
  859. ;
  860.     move.w    HcolME(A4),D4
  861.     move.w    HcolOP(A4),D5
  862.     move.w    #ZAEVI,HAEV(A4)
  863.     move.w    #ZBEVI,HBEV(A4)
  864.     move.l    RPBRD(A3),A5
  865.     move.l    HMV0-LHST(A4),A6    ; previous move
  866.     rts
  867. ;
  868. SOXPEVM: macro
  869.     movem.l    A0-A4/D0-D6,-(SP)
  870.     lea    ?1(PC),A4
  871.     bsr    SOMOV
  872.     movem.l    (SP)+,A0-A4/D0-D6
  873.     endm
  874. ;
  875. MRECIPE: macro
  876.     move.l    HRCP(A4),A0
  877.     jsr    (A0)
  878.     endm
  879. ;
  880. CALCMOVE:
  881.     moveq    #0,D0
  882.     MRECIPE
  883.     move.l    HMV0(A4),A0
  884.     move.l    HMV2(A4),D6
  885.     sub.l    A0,D6
  886.     lsr.w    #3,D6
  887.     SOXPEVM    SEWPEV
  888.     bsr    RNDMOVE
  889.     rts
  890. ;
  891. RNDMOVE:
  892.     move.l    HMV0(A4),A0    ; search equivalent moves
  893.     move.w    MPEV(A0),D0
  894. RNDMOVEL:
  895.     cmp.w    MPEV(A0),D0
  896.     bne.s    RNDMOVER
  897.     lea    LMOV(A0),A0
  898.     cmpa.l    HMV2(A4),A0
  899.     bne.s    RNDMOVEL
  900. RNDMOVER:
  901.     lea    RNDSEED(PC),A1    ; update seed
  902.     move.w    (A1),D1
  903.     mulu    #141,D1
  904.     addi.w    #1357,D1
  905.     move.w    D1,(A1)
  906.     move.l    A0,D0        ; calculate move
  907.     sub.l    HMV0(A4),D0
  908.     lsr.l    #3,D0
  909.     mulu    D1,D0
  910.     swap    D0
  911.     andi.l    #$FFFF,D0
  912.     lsl.w    #3,D0
  913.     move.l    HMV0(A4),A0
  914.     movem.l    (A0),D1-D2
  915.     move.l    0(A0,D0.w),(A0)
  916.     move.l    4(A0,D0.w),4(A0)
  917.     movem.l    D1-D2,0(A0,D0.w)
  918.     rts
  919. RNDSEED:
  920.     dc.w    12345
  921. ;
  922. DOMOVE:    ; execute entered move, first call INITMOVE
  923. ;
  924.     move.l    PGMVS(A3),HMV0(A4)
  925.     cmpi.w    #1,HPLYNR(A4)    ; check first move
  926.     bne.s    DOMOVEOK
  927.     move.w    PYDIM(A3),D0
  928.     lsr.w    #1,D0
  929.     cmp.w    PROW(A3),D0
  930.     bne    DOMOVEERR
  931.     move.w    PXDIM(A3),D0
  932.     lsr.w    #1,D0
  933.     cmp.w    PCOL(A3),D0
  934.     bne    DOMOVEERR
  935. DOMOVEOK:
  936.     move.w    PROW(A3),D7    ; calculate position according to
  937.     addq.w    #BRDR,D7    ; reduced boards
  938.     sub.w    RYLO(A3),D7
  939.     mulu    D3,D7
  940.     add.w    PCOL(A3),D7
  941.     addq.w    #BRDR,D7
  942.     sub.w    RXLO(A3),D7
  943.     tst.b    0(A5,D7.w)
  944.     bne.s    DOMOVEERR
  945. ;
  946.     move.b    #EVCall,PTQS(A3)
  947.     clr.w    HPEV(A4)
  948.     move.b    MMEV(A6),HBMEV(A4)    ; from previous move
  949.     move.b    HBMEV-LHST(A4),HWMEV(A4)
  950.     move.l    HMV0(A4),A6
  951. ;
  952.     move.w    REBRD(A3),-(SP)    ; adjust end of board
  953.     move.w    D7,REBRD(A3)    ; D7 is generated firstly
  954.     bsr    GMVS
  955.     move.w    (SP)+,REBRD(A3)    ; restore end of board
  956. ;
  957.     tst.b    D0        ; check WIN
  958.     bpl.s    DOMOVENOW    ; branch when NO WIN
  959.     move.w    HWIN(A4),D0    ; update MPEV0 with WIN evaluation
  960.     move.w    D0,MPEV0-LMOV(A6)
  961. DOMOVENOW:
  962.     move.l    HMV0(A4),A6
  963.     move.w    MPEV0(A6),MPEV(A6)
  964.     lea    LMOV(A6),A6
  965.     move.l    A6,HMV2(A4)
  966.     move.l    A6,PGMVS(A3)
  967.     moveq    #status_OK,D0
  968.     rts
  969. ;
  970. DOMOVEERR:
  971.     moveq    #status_ERROR,D0
  972.     rts
  973. ;
  974. EXECMOVE:
  975.     tst.w    PRDC(A3)
  976.     beq.s    EXECMOVERDC    ; skip RDC ?
  977.     bsr    INUNRDC
  978.     bsr    UNRDC
  979. EXECMOVERDC:
  980.     move.l    HMV0(A4),A6
  981.     move.w    MPEV0(A6),HPEV0(A4)    ; game-history
  982.     move.w    MPEV(A6),HPEV1(A4)    ; game-history
  983.     move.w    MPEV(A6),MPEV0(A6)    ; easy overview only
  984.     clr.w    MPEV(A6)        ; reset MPEV/MTQS
  985.     bsr    EFMV
  986.     lea    LMOV(A6),A6        ; A6 points to new move
  987.     move.l    A6,PGMVS(A3)
  988.     rts
  989. ;
  990. BACKMOVE:
  991.     lea    PBRD(A3),A5    ; restore board addresses
  992.     adda.l    HSBRD(A4),A5
  993. EXECBACK:
  994.     move.w    HcolME(A4),D4
  995.     move.w    HcolOP(A4),D5
  996.     move.l    HMV0(A4),A6
  997.     bsr    EBMV
  998.     move.l    A6,PGMVS(A3)
  999.     lea    -LHST(A4),A4
  1000.     rts
  1001. ;
  1002. DOEMOVE:
  1003.     move.w    #0,PRDC(A3)    ; reduce not
  1004.     bsr    INITMOVE
  1005.     bsr    DOMOVE
  1006.     cmpi.w    #status_OK,D0
  1007.     bne.s    DOEMOVEERR
  1008.     bsr    EXECMOVE
  1009.     moveq    #status_OK,D0
  1010.     rts
  1011. DOEMOVEERR:
  1012.     tst.w    PRDC(A3)
  1013.     beq.s    DOEMOVERDC    ; skip RDC ?
  1014.     bsr    INUNRDC
  1015.     bsr    UNRDC
  1016. DOEMOVERDC:
  1017.     move.l    HMV0(A4),PGMVS(A3)
  1018.     lea    -LHST(A4),A4
  1019.     rts
  1020. ;
  1021. INITBRD:
  1022.     moveq    #empsq,D0
  1023.     move.w    D3,D7
  1024.     mulu    D7,D7
  1025.     subq.w    #1,D7
  1026. ;
  1027.     lea    WHEVBRD(A3),A0
  1028.     move.w    D7,D6
  1029.     moveq    #0,D0
  1030. INITBRDLW:
  1031.     move.b    D0,(A0)+
  1032.     dbra    D6,INITBRDLW
  1033. ;
  1034.     lea    BLEVBRD(A3),A0
  1035.     move.w    D7,D6
  1036. INITBRDLB:
  1037.     move.b    D0,(A0)+
  1038.     dbra    D6,INITBRDLB
  1039. ;
  1040.     lea    PBRD(A3),A0
  1041.     move.w    D7,D6
  1042. INITBRDL:
  1043.     move.b    D0,(A0)+
  1044.     dbra    D6,INITBRDL
  1045.     bsr    INITBRDR
  1046. ;
  1047.     rts
  1048. ;
  1049. RDCSIZE:    ; reduce size of board by 2 rows out of convex hull
  1050.         ; fill arrays PXA and PYA with #1 when stone encountered
  1051.     movem.l    D0-D7/A0,-(SP)
  1052.     moveq    #0,D0
  1053. ;
  1054.     move.w    PXHI1(A3),D6        ; initialize array PXA
  1055.     move.b    #brdrsq,PXA(A3,D6.w)    ; brdrsq<>0
  1056.     subq.w    #1,D6
  1057. RDCSIZEX0:
  1058.     move.b    D0,PXA(A3,D6.w)
  1059.     dbra    D6,RDCSIZEX0
  1060.     move.w    PXLO1(A3),D6
  1061.     move.b    #brdrsq,PXA(A3,D6.w)
  1062. ;
  1063.     move.w    PYHI1(A3),D6    ; initialize array PYA
  1064.     move.b    #brdrsq,PYA(A3,D6.w)
  1065.     subq.w    #1,D6
  1066. RDCSIZEY0:
  1067.     move.b    D0,PYA(A3,D6.w)
  1068.     dbra    D6,RDCSIZEY0
  1069.     move.w    PYLO1(A3),D6
  1070.     move.b    #brdrsq,PYA(A3,D6.w)
  1071. ;
  1072.     lea    PBRD(A3),A0
  1073.     adda.l    D3,A0
  1074.     adda.l    D3,A0
  1075.     adda.l    D3,A0
  1076.     moveq    #BRDR,D5    ; Y-index
  1077.     move.w    PYDIM(A3),D7
  1078.     subq.w    #1,D7
  1079. RDCSIZEYL:
  1080.     move.w    PXHI1(A3),D6    ; X-index
  1081.     subq.w    #1,D6
  1082. RDCSIZEXL:
  1083.     tst.b    0(A0,D6.w)
  1084.     beq.s    RDCSIZEXN    ; skip empty square
  1085.     bmi.s    RDCSIZEXN    ; skip border square
  1086.     ori.b    #1,PXA(A3,D6.w)
  1087.     ori.b    #1,PYA(A3,D5.w)
  1088. RDCSIZEXN:
  1089.     dbra    D6,RDCSIZEXL
  1090.     adda.l    D3,A0
  1091.     addq.w    #1,D5
  1092.     dbra    D7,RDCSIZEYL
  1093. ;
  1094.     move.w    PXHI1(A3),D6    ; determine XHI
  1095.     lea    PXA(A3,D6),A0
  1096. RDCSIZEXHIL:
  1097.     subq.w    #1,D6
  1098.     tst.b    -(A0)
  1099.     beq.s    RDCSIZEXHIL
  1100.     cmp.w    PXLO1(A3),D6
  1101.     bgt.s    RDCSIZEXHI2
  1102.     move.w    D3,D6
  1103.     lsr.w    #1,D6
  1104. RDCSIZEXHI2:
  1105.     move.w    D6,RXHI2(A3)
  1106.     addq.w    #RBRDR+1,D6
  1107.     cmp.w    PXHI1(A3),D6
  1108.     ble.s    RDCSIZEXHI1
  1109.     move.w    PXHI1(A3),D6
  1110. RDCSIZEXHI1:
  1111.     move.w    D6,RXHI1(A3)
  1112.     subq.w    #1,D6
  1113.     move.w    D6,RXHI(A3)
  1114. ;
  1115.     moveq    #1,D6    ; determine XLO
  1116.     add.w    PXLO1(A3),D6
  1117.     lea    PXA(A3,D6),A0
  1118.     bra.s    RDCSIZEXLON
  1119. RDCSIZEXLOL:
  1120.     addq.w    #1,D6
  1121. RDCSIZEXLON:
  1122.     tst.b    (A0)+
  1123.     beq.s    RDCSIZEXLOL
  1124.     cmp.w    PXHI1(A3),D6
  1125.     blt.s    RDCSIZEXLO2
  1126.     move.w    D3,D6
  1127.     lsr.w    #1,D6
  1128. RDCSIZEXLO2:
  1129.     move.w    D6,RXLO2(A3)
  1130.     subq.w    #RBRDR+1,D6
  1131.     cmp.w    PXLO1(A3),D6
  1132.     bge.s    RDCSIZEXLO1
  1133.     move.w    PXLO1(A3),D6
  1134. RDCSIZEXLO1:
  1135.     move.w    D6,RXLO1(A3)
  1136.     addq.w    #1,D6
  1137.     move.w    D6,RXLO(A3)
  1138. ;
  1139.     move.w    RXHI1(A3),D6
  1140.     sub.w    RXLO(A3),D6
  1141.     move.w    D6,RXDIM(A3)
  1142. ;
  1143.     move.w    PYHI1(A3),D6    ; determine YHI
  1144.     lea    PYA(A3,D6),A0
  1145. RDCSIZEYHIL:
  1146.     subq.w    #1,D6
  1147.     tst.b    -(A0)
  1148.     beq.s    RDCSIZEYHIL
  1149.     cmp.w    PYLO1(A3),D6
  1150.     bgt.s    RDCSIZEYHI2
  1151.     move.w    PYMAX+2(A3),D6
  1152.     lsr.w    #1,D6
  1153. RDCSIZEYHI2:
  1154.     move.w    D6,RYHI2(A3)
  1155.     addq.w    #RBRDR+1,D6
  1156.     cmp.w    PYHI1(A3),D6
  1157.     ble.s    RDCSIZEYHI1
  1158.     move.w    PYHI1(A3),D6
  1159. RDCSIZEYHI1:
  1160.     move.w    D6,RYHI1(A3)
  1161.     subq.w    #1,D6
  1162.     move.w    D6,RYHI(A3)
  1163. ;
  1164.     moveq    #1,D6    ; determine YLO
  1165.     add.w    PYLO1(A3),D6
  1166.     lea    PYA(A3,D6),A0
  1167.     bra.s    RDCSIZEYLON
  1168. RDCSIZEYLOL:
  1169.     addq.w    #1,D6
  1170. RDCSIZEYLON:
  1171.     tst.b    (A0)+
  1172.     beq.s    RDCSIZEYLOL
  1173.     cmp.w    PYHI1(A3),D6
  1174.     blt.s    RDCSIZEYLO2
  1175.     move.w    PYMAX+2(A3),D6
  1176.     lsr.w    #1,D6
  1177. RDCSIZEYLO2:
  1178.     move.w    D6,RYLO2(A3)
  1179.     subq.w    #RBRDR+1,D6
  1180.     cmp.w    PYLO1(A3),D6
  1181.     bge.s    RDCSIZEYLO1
  1182.     move.w    PYLO1(A3),D6
  1183. RDCSIZEYLO1:
  1184.     move.w    D6,RYLO1(A3)
  1185.     addq.w    #1,D6
  1186.     move.w    D6,RYLO(A3)
  1187. ;
  1188.     move.w    RYHI1(A3),D6
  1189.     sub.w    RYLO(A3),D6
  1190.     move.w    D6,RYDIM(A3)
  1191. ;
  1192.     bsr    BRDADDS
  1193.     moveq    #rdcsq,D0
  1194.     bsr    RDC
  1195. ;
  1196.     movem.l    (SP)+,D0-D7/A0
  1197.     rts
  1198. ;
  1199. BRDADDS:    ; calculate board addresses
  1200. ;
  1201.     move.w    RYDIM(A3),D0    ; calculate size of reduced boards
  1202.     subq.w    #1,D0
  1203.     mulu    D3,D0
  1204.     add.w    RXDIM(A3),D0
  1205.     subq.w    #1,D0
  1206.     move.w    D0,REBRD(A3)
  1207.     move.w    RYLO(A3),D0    ; calculate begin of boards
  1208.     mulu    D3,D0
  1209.     add.w    RXLO(A3),D0
  1210.     move.l    D0,HSBRD(A4)
  1211.     lea    WHEVBRD(A3),A0
  1212.     adda.l    D0,A0
  1213.     move.l    A0,RWEVBRD(A3)
  1214.     lea    BLEVBRD(A3),A0
  1215.     adda.l    D0,A0
  1216.     move.l    A0,RBEVBRD(A3)
  1217.     lea    PBRD(A3),A0
  1218.     adda.l    D0,A0
  1219.     move.l    A0,RPBRD(A3)
  1220.     rts
  1221. ;
  1222. BRDRFILL:
  1223.     move.b    D0,(A0)
  1224.     rts
  1225. ;
  1226. RDC:    ; fill reduced border with rdcsq's
  1227.     moveq    #rdcsq,D0
  1228.     lea    BRDRFILL(PC),A6
  1229. RDCGO:
  1230.     movem.l    D4-D5,-(SP)
  1231.     move.l    RPBRD(A3),A0
  1232.     suba.l    D3,A0
  1233.     tst.b    -(A0)        ; now A0 points to RXLO1,RYLO1
  1234.     move.w    RXDIM(A3),D4
  1235.     move.w    RYDIM(A3),D5
  1236.     bsr    JBRDR
  1237.     movem.l    (SP)+,D4-D5
  1238.     rts
  1239. ;
  1240. UNRDC:    ; fill reduced border with empsq's
  1241.     moveq    #empsq,D0
  1242.     lea    BRDRFILL(PC),A6
  1243.     bsr    RDCGO
  1244. INITBRDR:
  1245.     moveq    #brdrsq,D0
  1246.     lea    BRDRFILL(PC),A6
  1247. ;
  1248.     movem.l    D4-D5,-(SP)
  1249.     move.w    PYLO1(A3),D6
  1250.     mulu    D3,D6
  1251.     add.w    PXLO1(A3),D6
  1252.     lea    PBRD(A3),A0
  1253.     adda.w    D6,A0
  1254.     move.w    PXDIM(A3),D4
  1255.     move.w    PYDIM(A3),D5
  1256.     bsr    JBRDR
  1257.     movem.l    (SP)+,D4-D5
  1258.     rts
  1259. ;
  1260. INRDCJ:    ; Inner reduce subroutine
  1261. ;
  1262.     lea    -RBRDR(A0),A1
  1263.     suba.l    D3,A1        ; RBRDR times
  1264.     suba.l    D3,A1
  1265.     moveq    #2*RBRDR,D1
  1266. INRDCJYL:
  1267.     moveq    #2*RBRDR,D2
  1268. INRDCJXL:
  1269.     tst.b    0(A1,D2.w)
  1270.     beq.s    INRDCJXN    ; check empty square
  1271.     bpl.s    INRDCJF        ; check stone at square
  1272. INRDCJXN:
  1273.     dbra    D2,INRDCJXL
  1274.     adda.l    D3,A1
  1275.     dbra    D1,INRDCJYL
  1276.     move.b    D0,(A0)
  1277. INRDCJF:
  1278.     rts
  1279. ;
  1280. INUNRDCJ: ; Inner unreduce subroutine
  1281. ;
  1282.     tst.b    (A0)
  1283.     bpl.s    INUNRDCJE    ; test empty square or stone
  1284.     move.b    D0,(A0)    ; empsq
  1285. INUNRDCJE:
  1286.     rts
  1287. ;
  1288. INUNRDC: ; Inner unreduce
  1289. ;
  1290.     moveq    #empsq,D0
  1291.     lea    INUNRDCJ(PC),A6
  1292.     bra.s    INRDCGO
  1293. ;
  1294. INRDC:    ; Inner reduce
  1295. ;
  1296.     moveq    #rdcsq,D0
  1297.     lea    INRDCJ(PC),A6
  1298. INRDCGO:
  1299.     movem.l    D4-D5,-(SP)
  1300.     move.l    RPBRD(A3),A0
  1301.     move.w    RXDIM(A3),D4
  1302.     subq.w    #2,D4
  1303.     move.w    RYDIM(A3),D5
  1304.     subq.w    #2,D5
  1305.     move.l    A0,-(SP)    ; save for next inner rectangle
  1306.     bsr    JBRDR
  1307.     move.l    (SP)+,A0
  1308.     lea    1(A0,D3.w),A0    ; address of next inner rectangle
  1309.     subq.w    #2,D4
  1310.     subq.w    #2,D5
  1311.     bsr    JBRDR
  1312. ;
  1313.     move.w    REBRD(A3),D7    ; calculate negative jump values
  1314.     move.l    RPBRD(A3),A5
  1315.     move.l    A5,A0
  1316.     lea    0(A0,D7.w),A0    ; A0 points to RXHI,RYHI
  1317.     suba.w    RXDIM(A3),A0    ; A0 points to RXLO1,RYHI
  1318. ;
  1319.     move.w    RYDIM(A3),D2
  1320.     subq.w    #1,D2
  1321. INRDCYL:
  1322.     move.w    RXDIM(A3),D1
  1323. INRDCXL:
  1324.     tst.b    0(A0,D1.w)
  1325.     bpl.s    INRDCXN
  1326.     move.w    D7,D6        ; rdcsq found
  1327.     bra.s    INRDCRXN
  1328. INRDCRYL:
  1329.     move.w    RXDIM(A3),D1
  1330. INRDCRXL:
  1331.     tst.b    0(A0,D1.w)
  1332.     bpl.s    INRDCRF
  1333. INRDCRXN:
  1334.     subq.w    #1,D7
  1335.     dbra    D1,INRDCRXL
  1336. ;
  1337.     suba.l    D3,A0
  1338.     addq.w    #1,D7        ; D1-loop takes RXDIM+1
  1339.     add.w    RXDIM(A3),D7
  1340.     sub.w    D3,D7
  1341.     dbra    D2,INRDCRYL
  1342. INRDCRF:
  1343.     move.w    D7,D0
  1344.     sub.w    D6,D0
  1345.     move.b    D0,0(A5,D6.w)
  1346.     tst.w    D7
  1347.     bmi.s    INRDCE
  1348. INRDCXN:
  1349.     subq.w    #1,D7
  1350.     dbra    D1,INRDCXL
  1351. ;
  1352.     suba.l    D3,A0
  1353.     addq.w    #1,D7        ; D1-loop takes RXDIM+1
  1354.     add.w    RXDIM(A3),D7
  1355.     sub.w    D3,D7
  1356.     dbra    D2,INRDCYL
  1357. INRDCE:
  1358.     movem.l    (SP)+,D4-D5
  1359.     rts
  1360. ;
  1361. JBRDR:    ; general subroutine for border
  1362. ;            ; sequence of filling :
  1363. ; input registers:    ; 1 1 -> 1 2
  1364. ; D3 : PXMAX        ; 3        2
  1365. ; D4 : Xdim        ; 3        |
  1366. ; D5 : Ydim        ; |        V
  1367. ; A0 : start-address    ; V        2
  1368. ; A6 : subroutine    ; 3 4 4 -> 4
  1369. ;
  1370.     move.l    A0,-(SP)
  1371.     move.w    D4,D6
  1372. JBRDRYLOXL:
  1373.     jsr    (A6)
  1374.     tst.b    (A0)+
  1375.     dbra    D6,JBRDRYLOXL
  1376. ;
  1377.     move.w    D5,D6
  1378. JBRDRXHIYL:
  1379.     jsr    (A6)
  1380.     adda.l    D3,A0
  1381.     dbra    D6,JBRDRXHIYL
  1382. ;
  1383.     move.l    (SP)+,A0
  1384.     move.w    D5,D6
  1385. JBRDRXLOYL:
  1386.     adda.l    D3,A0
  1387.     jsr    (A6)
  1388.     dbra    D6,JBRDRXLOYL
  1389. ;
  1390.     move.w    D4,D6
  1391.     tst.b    (A0)+
  1392. JBRDRYHIXL:
  1393.     jsr    (A6)
  1394.     tst.b    (A0)+
  1395.     dbra    D6,JBRDRYHIXL
  1396.     rts
  1397. ;
  1398. MWR:    macro    ; parameters label_empty,label_stop/border,label_black
  1399.     add.w    D0,D6
  1400.     move.b    0(A5,D6.w),D2
  1401.     beq    ?1
  1402.     bmi    ?2
  1403.     cmp.b    D4,D2
  1404.     bne    ?3
  1405.     endm
  1406. ;
  1407. MWRE:    macro    ; parameters label_empty/border,label_black
  1408.     add.w    D0,D6
  1409.     move.b    0(A5,D6.w),D2
  1410.     ble    ?1
  1411.     cmp.b    D4,D2
  1412.     bne    ?2
  1413.     endm
  1414. ;
  1415. MWRW:    macro    ; parameter label_stop
  1416.     add.w    D0,D6
  1417.     cmp.b    0(A5,D6.w),D4
  1418.     bne    ?1
  1419.     endm
  1420. ;
  1421. MWRB:    macro    ; parameter label_stop
  1422.     add.w    D0,D6
  1423.     cmp.b    0(A5,D6.w),D5
  1424.     bne    ?1
  1425.     endm
  1426. ;
  1427. MWL:    macro    ; parameters label_empty,label_stop/border,label_black
  1428.     sub.w    D0,D6
  1429.     move.b    0(A5,D6.w),D2
  1430.     beq    ?1
  1431.     bmi    ?2
  1432.     cmp.b    D4,D2
  1433.     bne    ?3
  1434.     endm
  1435. ;
  1436. MWLE:    macro    ; parameters label_empty/border,label_black
  1437.     sub.w    D0,D6
  1438.     move.b    0(A5,D6.w),D2
  1439.     ble    ?1
  1440.     cmp.b    D4,D2
  1441.     bne    ?2
  1442.     endm
  1443. ;
  1444. MWLW:    macro    ; parameter label_stop
  1445.     sub.w    D0,D6
  1446.     cmp.b    0(A5,D6.w),D4
  1447.     bne    ?1
  1448.     endm
  1449. ;
  1450. MWLB:    macro    ; parameter label_stop
  1451.     sub.w    D0,D6
  1452.     cmp.b    0(A5,D6.w),D5
  1453.     bne    ?1
  1454.     endm
  1455. ;
  1456. QS_WIN:    macro
  1457.     moveq    #-1,D0
  1458.     rts
  1459.     endm
  1460. ;
  1461. QS_tkr: macro    ; parameter label_stop
  1462.     addq.b    #1,MMEV(A6)
  1463.     add.w    D3,MPEV0(A6)
  1464.     bset    D1,MTK(A6)
  1465.     ori.b    #EVCtkr,MTQS(A6)
  1466.     bra    ?1
  1467.     endm
  1468. ;
  1469. QS_tkl: macro    ; parameter label_stop
  1470.     addq.b    #1,MMEV(A6)
  1471.     add.w    D3,MPEV0(A6)
  1472.     subq.w    #4,D1
  1473.     bset    D1,MTK(A6)
  1474.     addq.w    #4,D1
  1475.     ori.b    #EVCtkl,MTQS(A6)
  1476.     bra    ?1
  1477.     endm
  1478. ;
  1479. QS_5t: macro    ; parameter label_stop
  1480.     ori.b    #EVC5t,MTQS(A6)
  1481.     bra    ?1
  1482.     endm
  1483. ;
  1484. QS_5dt: macro    ; parameter label_stop
  1485.     ori.b    #EVC5t,MTQS(A6)
  1486.     bra    ?1
  1487.     endm
  1488. ;
  1489. QS_5s: macro    ; parameter label_stop
  1490.     ori.b    #EVC5s,MTQS(A6)
  1491.     bra    ?1
  1492.     endm
  1493. ;
  1494. QS_tkt: macro    ; parameter label_stop
  1495.     ori.b    #EVCtkt,MTQS(A6)
  1496.     bra    ?1
  1497.     endm
  1498. ;
  1499. QS_tks: macro    ; parameter label_stop
  1500.     ori.b    #EVCtks,MTQS(A6)
  1501.     bra    ?1
  1502.     endm
  1503. ;
  1504. QSstart:
  1505. ; D0 : direction increment
  1506. ; D1 : direction bit
  1507. ; D2 : temporary square contents
  1508. ; D3 : positional evaluation bonus
  1509. ; D4 : player's color
  1510. ; D5 : opponent's color
  1511. ; D6 : temporary square
  1512. ; D7 : square of move
  1513. ;
  1514.     move.w    D7,D6
  1515. rQS____:    MWR    rQSe___, l____QS,    rQSb___
  1516. rQSw___:    MWR    rQSwe__, l____QSw,   l____QSw
  1517. rQSww__:    MWR    rQSwwe_, l____QSww,  rQSwwb
  1518. rQSwww_:    MWR    rQSwwwe, l____QSwww, l____QSwww
  1519. rQSwwww:    QS_WIN
  1520. ;
  1521. rQSe___:    MWRW    l____QSe
  1522. rQSew__:    MWRW    l____QSew
  1523. rQSeww_:    MWRW    l____QSeww
  1524. rQSewww:    QS_5t    l____QS
  1525. ;
  1526. rQSb___:    MWRB    l____QSb
  1527. rQSbb__:    MWR    rQSbbe, l____QSbb, rQSbbb_
  1528. rQSbbw:        QS_tkr    l____QSbb
  1529. ;
  1530. rQSbbe:        QS_tkt    l____QSbb
  1531. ;
  1532. rQSbbb_:    MWRB    l____QSbbb
  1533. rQSbbbb:    QS_5s    l____QS
  1534. ;
  1535. rQSwe__:    MWRW    l____QSwe
  1536. rQSwew_:    MWRW    l____QSwew
  1537. rQSweww:    QS_5t    l____QSw
  1538. ;
  1539. rQSwwe_:    MWRW    l____QSwwe
  1540. rQSwwew:    QS_5t    l____QSww
  1541. ;
  1542. rQSwwb:        QS_tks    l____QSww
  1543. ;
  1544. rQSwwwe:    QS_5t    l____QSwww
  1545. ;
  1546. l____QS:    move.w    D7,D6
  1547.         MWL    l___eQS, QSend, l___bQS
  1548. l___wQS:    MWL    l__ewQS, QSend, QSend
  1549. l__wwQS:    MWL    l_ewwQS, QSend, lbwwQS
  1550. l_wwwQS:    MWL    lewwwQS, QSend, QSend
  1551. lwwwwQS:    QS_WIN
  1552. ;
  1553. l___bQS:    MWLB    QSend
  1554. l__bbQS:    MWL    lebbQS, QSend, l_bbbQS
  1555. l_wbbQS:    QS_tkl    QSend
  1556. ;
  1557. l_bbbQS:    MWLB    QSend
  1558. lbbbbQS:    QS_5s    QSend
  1559. ;
  1560. lebbQS:        QS_tkt    QSend
  1561. ;
  1562. lbwwQS:        QS_tks    QSend
  1563. ;
  1564. l____QSw:    move.w    D7,D6
  1565.         MWL    l___eQSw, QSend, l___bQS
  1566. l___wQSw:    MWL    l__ewQSw, QSend, QSend
  1567. l__wwQSw:    MWL    lewwQSw,  QSend, lbwwQS
  1568. lwwwQSw:    QS_WIN
  1569. ;
  1570. l___eQS:    MWLW    QSend
  1571. l__ewQS:
  1572. l__weQS:
  1573. l___eQSw:    MWLW    QSend
  1574. l_ewwQS:
  1575. l_wewQS:
  1576. l_wweQS:
  1577. l__ewQSw:
  1578. l__weQSw:
  1579. l___eQSww:    MWLW    QSend
  1580. lewwwQS:
  1581. lwwweQS:
  1582. lwwwQSe:
  1583. lewwQSw:
  1584. lwewQSw:
  1585. lwweQSw:
  1586. lewQSww:
  1587. lwwQSew:
  1588. lwwQSwe:
  1589. leQSwww:
  1590. lwQSwwe:
  1591. lwQSwew:
  1592. lwQSeww:    QS_5t    QSend
  1593. ;
  1594. l____QSe:    move.w    D7,D6
  1595.         MWL    l___eQS, QSend, l___bQS
  1596. l___wQSe:    MWL    l__ewQS, QSend, QSend
  1597. l__wwQSe:    MWL    l_ewwQS, QSend, lbwwQS
  1598. l_wwwQSe:    QS_5t    l_wwwQS
  1599. ;
  1600. l____QSww:    move.w    D7,D6
  1601.         MWL    l___eQSww, QSend, l___bQS
  1602. l___wQSww:    MWL    lewQSww,   QSend, QSend
  1603. lwwQSww:    QS_WIN
  1604. ;
  1605. l____QSwe:    move.w    D7,D6
  1606.         MWL    l___eQSw, QSend,  l___bQS
  1607. l___wQSwe:    MWL    l__ewQSw, QSend,  QSend
  1608. l__wwQSwe:    QS_5t    l__wwQSw
  1609. ;
  1610. l____QSew:    move.w    D7,D6
  1611.         MWL    l___eQS, QSend, l___bQS
  1612. l___wQSew:    MWL    l__ewQS, QSend, QSend
  1613. l__wwQSew:    QS_5t    l__wwQS
  1614. ;
  1615. l____QSwww:    move.w    D7,D6
  1616.         MWL    leQSwww, QSend, l___bQS
  1617. lwQSwww:    QS_WIN
  1618. ;
  1619. l____QSwwe:    move.w    D7,D6
  1620.         MWL    l___eQS,  QSend, l___bQS
  1621. l___wQSwwe:    QS_5t    l___wQSww
  1622. ;
  1623. l____QSwew:    move.w    D7,D6
  1624.         MWL    l___eQSw, QSend, l___bQS
  1625. l___wQSwew:    QS_5t    l___wQSw
  1626. ;
  1627. l____QSeww:    move.w    D7,D6
  1628.         MWL    l___eQS, QSend, l___bQS
  1629. l___wQSeww:    QS_5t    l___wQS
  1630. ;
  1631. l____QSb:    move.w    D7,D6
  1632.         MWL    l___eQS, QSend, l___bQSb
  1633. l___wQSb:    bra    l___wQS
  1634. ;
  1635. l___bQSb:    MWLB    QSend
  1636. l__bbQSb:    MWL    lebbQS, QSend, lbbbQSb
  1637. lwbbQSb:    QS_tkl    QSend
  1638. ;
  1639. lbQSbbb:
  1640. lbbQSbb:
  1641. lbbbQSb:    QS_5s    QSend
  1642. ;
  1643. l____QSbb:    move.w    D7,D6
  1644.         MWL    l___eQS, QSend, l___bQSbb
  1645. l___wQSbb:    bra    l___wQS
  1646. ;
  1647. l___bQSbb:    MWLB    QSend
  1648. l__bbQSbb:    QS_5s    l__bbQS
  1649. ;
  1650. l____QSbbb:    move.w    D7,D6
  1651.         MWL    l___eQS, QSend, l___bQSbbb
  1652. l___wQSbbb:    bra    l___wQS
  1653. ;
  1654. l___bQSbbb:    QS_5s    l___bQS
  1655. ;
  1656. QSend:    moveq    #0,D0
  1657.     rts
  1658. ;
  1659. GQS:    ; generate takes and threats
  1660. ; D0 : scratch, return 0=noWIN, -1=WIN
  1661. ; D1 : scratch
  1662. ; D2 : temporary, original value destroyed
  1663. ; D3 : original value restored
  1664. ; D4 : my color
  1665. ; D5 : opponent color
  1666. ;
  1667.     move.l    D3,-(SP)
  1668.     clr.b    PIQS(A3)    ; clear integral QS-code
  1669.     move.w    PMVAL(A3),D3
  1670.     move.w    REBRD(A3),D7
  1671. GQSL:
  1672.     move.b    0(A5,D7.w),D0
  1673.     beq.s    GQSM
  1674.     bpl.s    GQSN
  1675.     ext.w    D0
  1676.     add.w    D0,D7
  1677.     bpl.s    GQSL
  1678.     bmi.s    GQSEL
  1679. GQSM:
  1680.     move.w    D7,MSQ(A6)
  1681.     move.w    HPEV(A4),MPEV0(A6)
  1682.     move.b    HWMEV(A4),MMEV(A6)
  1683. ;
  1684.     move.b    #EVCn,MTQS(A6)    ; indicates normal move
  1685.     moveq    #4,D1
  1686.     clr.b    MTK(A6)
  1687.     lea    DIRS+8(PC),A0
  1688.     move.w    (A0)+,D0
  1689. GQSML:
  1690.     bsr    QSstart
  1691.     bmi.s    QQWIN
  1692.     addq.w    #1,D1
  1693.     move.w    (A0)+,D0
  1694.     bne.s    GQSML
  1695. ;
  1696.     move.b    MTQS(A6),D0    ; pattern of realised move
  1697.     and.b    PTQS(A3),D0    ; pattern of allowed moves
  1698.     beq.s    GQSN
  1699.     or.b    D0,PIQS(A3)    ; add possibly EVC5s-code
  1700.     move.b    MMEV(A6),D0
  1701.     cmp.b    PMEVLIM+1(A3),D0
  1702.     bge.s    QQWIN
  1703. GQSC:
  1704.     lea    LMOV(A6),A6
  1705. GQSN:
  1706.     dbra    D7,GQSL
  1707. GQSEL:
  1708.     move.l    (SP)+,D3
  1709.     moveq    #0,D0
  1710.     rts
  1711. ;
  1712. QQWIN:    lea    LMOV(A6),A6
  1713.     move.l    (SP)+,D3
  1714.     moveq    #-1,D0
  1715.     rts
  1716. ;            white-code        black-code
  1717.     dc.w    %0000000000000000,%0000000000000000    ; - 80, $00
  1718.     dc.w    %0000000000000000,%0000000000000000    ; - 76, $04
  1719.     dc.w    %0000000000000000,%0000000000000000    ; - 72, $08
  1720.     dc.w    %0000000000000000,%0000000000000000    ; - 68, $0C
  1721.     dc.w    %0000000000000000,%0000000000000000    ; - 64, $10
  1722.     dc.w    %0000000000000000,%0000000000000000    ; - 60, $14
  1723.     dc.w    %0000000000000000,%0000000000000000    ; - 56, $18
  1724.     dc.w    %0000000000000000,%0000000000000000    ; - 52, $1C
  1725.     dc.w    0,0,0,0,0,0,0,0                ; - 48, $20
  1726.     dc.w    %0000000001000000,%0000000010000000    ; - 32, $30
  1727.     dc.w    %0000000010000000,%0000000001000000    ; - 28, $34
  1728.     dc.w    %0000000000010000,%0000000000100000    ; - 24, $38
  1729.     dc.w    %0000000000100000,%0000000000010000    ; - 20, $3C
  1730.     dc.w    %0000000000000100,%0000000000001000    ; - 16, $40
  1731.     dc.w    %0000000000001000,%0000000000000100    ; - 12, $44
  1732.     dc.w    %0000000000000001,%0000000000000010    ; -  8, $48
  1733.     dc.w    %0000000000000010,%0000000000000001    ; -  4, $4C
  1734. TWGMV:    dc.w    %0000000000000000            ; +  0, $50
  1735. TBGMV:    dc.w    %0000000000000000            ; +  2, $02
  1736.     dc.w    %0000000000000000,%0000000000000000    ; +  4, $04
  1737.     dc.w    %0000000000000000,%0000000000000000    ; +  8, $08
  1738.     dc.w    %0000000000000000,%0000000000000000    ; + 12, $0C
  1739.     dc.w    %0000000000000000,%0000000000000000    ; + 16, $10
  1740.     dc.w    %0000000000000000,%0000000000000000    ; + 20, $14
  1741.     dc.w    %0000000000000000,%0000000000000000    ; + 24, $18
  1742.     dc.w    %0000000000000000,%0000000000000000    ; + 28, $1C
  1743.     dc.w    0,0,0,0,0,0,0,0                ; + 32, $20
  1744.     dc.w    %0000000100000000,%0000001000000000    ; + 48, $30
  1745.     dc.w    %0000001000000000,%0000000100000000    ; + 52, $34
  1746.     dc.w    %0000010000000000,%0000100000000000    ; + 56, $38
  1747.     dc.w    %0000100000000000,%0000010000000000    ; + 60, $3C
  1748.     dc.w    %0001000000000000,%0010000000000000    ; + 64, $40
  1749.     dc.w    %0010000000000000,%0001000000000000    ; + 68, $44
  1750.     dc.w    %0100000000000000,%1000000000000000    ; + 72, $48
  1751.     dc.w    %1000000000000000,%0100000000000000    ; + 76, $4C
  1752. ;
  1753. MGMVR:    macro    ; parameter end-code,displacement
  1754.     add.w    D0,D6
  1755.     move.b    0(A5,D6.w),D2
  1756.     bpl.s    MGMVR?0
  1757.     ori.w    #?1,D3
  1758.     bra.s    GMVLT
  1759. MGMVR?0:
  1760.     or.w    ?2(A0,D2.w),D3
  1761.     endm
  1762. ;
  1763. MGMVL:    macro    ; parameter end-code,displacement
  1764.     sub.w    D0,D6
  1765.     move.b    0(A5,D6.w),D2
  1766.     bpl.s    MGMVL?0
  1767.     ori.w    #?1,D3
  1768.     bra.s    GMVE
  1769. MGMVL?0:
  1770.     or.w    ?2(A0,D2.w),D3
  1771.     endm
  1772. ;
  1773. GMVS:
  1774. ;    assumption : A3 : PSN
  1775. ;             A4 : HST, PGMV
  1776. ;             A5 : BRD
  1777. ;             A6 : MOVS
  1778. ;             D7 : stone square
  1779. ;    usage         A0 : DIRS
  1780. ;             A1 : WEVBRD, TableC
  1781. ;             A2 : BEVBRD, TableEV
  1782. ;             D0 : scratch, return 0=noWIN, 1=WIN
  1783. ;             D1 : scratch
  1784. ;             D4 : MY color
  1785. ;             D5 : OPPONENT color
  1786. ;
  1787.     move.l    D3,-(SP)    ; high-byte = 0
  1788.     clr.b    PIQS(A3)    ; clear integral QS-code
  1789.     move.w    REBRD(A3),D7
  1790. GMVSL:
  1791.     move.b    0(A5,D7.w),D0
  1792.     beq.s    GMVSM
  1793.     bpl    GMVSN
  1794.     ext.w    D0
  1795.     add.w    D0,D7
  1796.     bpl.s    GMVSL
  1797.     bmi    GMVSEL
  1798. GMVSM:
  1799.     move.w    D7,MSQ(A6)
  1800.     move.b    #EVCn,MTQS(A6)
  1801.     clr.b    MTK(A6)
  1802.     move.b    HWMEV(A4),MMEV(A6)
  1803. ;
  1804.     movem.l    HWEVBRD(A4),A1/A2    ; HWEVBRD/HBEVBRD
  1805.     move.w    HPEV(A4),D2
  1806.     moveq    #0,D3
  1807.     move.b    0(A1,D7.w),D3
  1808.     add.w    D3,D2
  1809.     move.b    0(A2,D7.w),D3
  1810.     add.w    D3,D2
  1811.     move.w    D2,MPEV0(A6)
  1812. ;
  1813.     move.l    HTGMV(A4),A0        ; TXGMV
  1814.     movem.l    PTableC(A3),A1/A2    ; TableC/TableEV
  1815.     move.l    A4,-(SP)
  1816. ;
  1817.     moveq    #0,D2        ; temp. neighbour
  1818.                 ; note high-byte(D2)==0!!!
  1819.     moveq    #4,D1        ; direction-index
  1820.     lea    DIRS+8(PC),A4
  1821.     move.w    (A4)+,D0
  1822. GMVL:
  1823. GMVRT:
  1824.     moveq    #0,D3        ; build neighbour-pattern
  1825.     move.w    D7,D6
  1826.     MGMVR    %0000000011111111, -80
  1827.     MGMVR    %0000000000111111, -72
  1828.     MGMVR    %0000000000001111, -64
  1829.     MGMVR    %0000000000000011, -56
  1830. GMVLT:
  1831.     move.w    D7,D6
  1832.     MGMVL    %1111111100000000, 0
  1833.     MGMVL    %1111110000000000, 8
  1834.     MGMVL    %1111000000000000, 16
  1835.     MGMVL    %1100000000000000, 24
  1836. GMVE:
  1837.     move.b    0(A1,D3.l),D2
  1838.     bmi.s    GMVSW
  1839.     or.b    D2,MTQS(A6)
  1840. GMVtkr:
  1841.     lsr.b    #1,D2
  1842.     bcc.s    GMVtkl
  1843.     bset    D1,MTK(A6)
  1844.     addq.b    #1,MMEV(A6)
  1845. GMVtkl:
  1846.     lsr.b    #1,D2
  1847.     bcc.s    GMVEV
  1848.     subq.b    #4,D1
  1849.     bset    D1,MTK(A6)
  1850.     addq.b    #4,D1
  1851.     addq.b    #1,MMEV(A6)
  1852. GMVEV:
  1853.     add.l    D3,D3
  1854.     move.w    0(A2,D3.l),D3
  1855.     add.w    D3,MPEV0(A6)
  1856. GMVN:
  1857.     addq.w    #1,D1
  1858.     move.w    (A4)+,D0
  1859.     bne    GMVL
  1860. ;
  1861.     move.l    (SP)+,A4    ; restore A4
  1862.     move.b    PTQS(A3),D0    ; pattern of allowed moves
  1863.     and.b    MTQS(A6),D0    ; pattern of realised move
  1864.     beq.s    GMVSN
  1865. ;
  1866.     or.b    D0,PIQS(A3)    ; add possibly EVC5s-code
  1867.     move.b    MMEV(A6),D0
  1868.     cmp.b    PMEVLIM+1(A3),D0
  1869.     bge.s    GMVSWM
  1870. ;
  1871.     lea    LMOV(A6),A6
  1872. GMVSN:
  1873.     dbra    D7,GMVSL
  1874. GMVSEL:
  1875.     move.l    (SP)+,D3
  1876.     moveq    #0,D0
  1877.     rts
  1878. ;
  1879. GMVSW:    move.l    (SP)+,A4        ; restore A4
  1880. GMVSWM:    lea    LMOV(A6),A6
  1881.     move.l    (SP)+,D3
  1882.     moveq    #-1,D0
  1883.     rts
  1884. ;
  1885. ; adjust PEV boards by additions
  1886. ;
  1887. EBBEVBRD:
  1888.     move.l    HBEVBRD(A4),A1
  1889.     lea    -BRDR(A1,D6.w),A1
  1890.     bra.s    EBBEVBRDFW
  1891. EFWEVBRD:
  1892.     move.l    HWEVBRD(A4),A1
  1893.     lea    -BRDR(A1,D7.w),A1
  1894. EBBEVBRDFW:
  1895.     suba.l    D3,A1
  1896.     suba.l    D3,A1
  1897.     suba.l    D3,A1
  1898.     lea    PEVPAT(A3),A2
  1899.     moveq    #0,D2
  1900.     moveq    #2*BRDR,D1
  1901. EFWEVBRDL1:
  1902.     moveq    #2*BRDR,D0
  1903. EFWEVBRDL0:
  1904.     move.b    (A2)+,D2
  1905.     add.b    D2,0(A1,D0.w)
  1906.     dbra    D0,EFWEVBRDL0
  1907.     adda.l    D3,A1
  1908.     dbra    D1,EFWEVBRDL1
  1909.     rts
  1910. ;
  1911. ; adjust PEV boards by subtractions
  1912. ;
  1913. EFBEVBRD:
  1914.     move.l    HBEVBRD(A4),A1
  1915.     lea    -BRDR(A1,D6.w),A1
  1916.     bra.s    EFBEVBRDBW
  1917. EBWEVBRD:
  1918.     move.l    HWEVBRD(A4),A1
  1919.     lea    -BRDR(A1,D7.w),A1
  1920. EFBEVBRDBW:
  1921.     suba.l    D3,A1
  1922.     suba.l    D3,A1
  1923.     suba.l    D3,A1
  1924.     lea    PEVPAT(A3),A2
  1925.     moveq    #0,D2
  1926.     moveq    #2*BRDR,D1
  1927. EFBEVBRDL1:
  1928.     moveq    #2*BRDR,D0
  1929. EFBEVBRDL0:
  1930.     move.b    (A2)+,D2
  1931.     sub.b    D2,0(A1,D0.w)
  1932.     dbra    D0,EFBEVBRDL0
  1933.     adda.l    D3,A1
  1934.     dbra    D1,EFBEVBRDL1
  1935.     rts
  1936. ;
  1937. EFMV:    ; Execute Forward Move
  1938. ;
  1939.     move.w    MSQ(A6),D7
  1940.     move.b    D4,0(A5,D7.w)
  1941.     bsr    EFWEVBRD
  1942.     move.b    MTK(A6),D1
  1943.     beq.s    EFMVE
  1944. ;
  1945.     lea    DIRS-2(PC),A0
  1946. EFMVL:
  1947.     tst.w    (A0)+
  1948.     lsr.b    #1,D1
  1949.     bcc.s    EFMVL
  1950.     move.b    D1,-(SP)
  1951.     move.w    D7,D6
  1952.     add.w    (A0),D6
  1953.     move.b    #empsq,0(A5,D6.w)
  1954.     bsr    EFBEVBRD
  1955.     add.w    (A0),D6
  1956.     move.b    #empsq,0(A5,D6.w)
  1957.     bsr    EFBEVBRD
  1958.     move.b    (SP)+,D1
  1959.     bne.s    EFMVL
  1960. EFMVE:
  1961.     rts
  1962. ;
  1963. EBMV:    ; Execute Backward Move
  1964. ;
  1965.     move.w    MSQ(A6),D7
  1966.     move.b    #empsq,0(A5,D7.w)
  1967.     bsr    EBWEVBRD
  1968.     move.b    MTK(A6),D1
  1969.     beq.s    EBMVE
  1970. ;
  1971.     lea    DIRS-2(PC),A0
  1972. EBMVL:
  1973.     tst.w    (A0)+
  1974.     lsr.b    #1,D1
  1975.     bcc.s    EBMVL
  1976.     move.b    D1,-(SP)
  1977.     move.w    D7,D6
  1978.     add.w    (A0),D6
  1979.     move.b    D5,0(A5,D6.w)
  1980.     bsr    EBBEVBRD
  1981.     add.w    (A0),D6
  1982.     move.b    D5,0(A5,D6.w)
  1983.     bsr    EBBEVBRD
  1984.     move.b    (SP)+,D1
  1985.     bne.s    EBMVL
  1986. EBMVE:
  1987.     rts
  1988. ;
  1989. EFQS:    ; Execute Forward Quiescense Search
  1990. ;
  1991.     move.w    MSQ(A6),D7
  1992.     move.b    D4,0(A5,D7.w)
  1993.     move.b    MTK(A6),D1
  1994.     beq.s    EFQSE
  1995. ;
  1996.     lea    DIRS(PC),A0
  1997. EFQSL:
  1998.     move.w    (A0)+,D0
  1999.     lsr.b    #1,D1
  2000.     bcc.s    EFQSL
  2001.     move.w    D7,D6
  2002.     add.w    D0,D6
  2003.     move.b    #empsq,0(A5,D6.w)
  2004.     add.w    D0,D6
  2005.     move.b    #empsq,0(A5,D6.w)
  2006.     tst.b    D1
  2007.     bne.s    EFQSL
  2008. EFQSE:    rts
  2009. ;
  2010. EBQS:    ; Execute Backward Quiescense Search
  2011. ;
  2012.     move.w    MSQ(A6),D7
  2013.     move.b    #empsq,0(A5,D7.w)
  2014.     move.b    MTK(A6),D1
  2015.     beq.s    EBQSE
  2016. ;
  2017.     lea    DIRS(PC),A0
  2018. EBQSL:
  2019.     move.w    (A0)+,D0
  2020.     lsr.b    #1,D1
  2021.     bcc.s    EBQSL
  2022.     move.w    D7,D6
  2023.     add.w    D0,D6
  2024.     move.b    D5,0(A5,D6.w)
  2025.     add.w    D0,D6
  2026.     move.b    D5,0(A5,D6.w)
  2027.     tst.b    D1
  2028.     bne.s    EBQSL
  2029. EBQSE:    rts
  2030. ;
  2031. SEYWMOV: macro
  2032. ; D0.w  EV* to be searched for
  2033. ; D1.w  MAXrecNR,    ALSO output-recnr
  2034. ; A0.l  STARTrecAD
  2035. ;
  2036. ; v(D3) >= v(D2) >= v(D1)
  2037. ;
  2038.     move.w    D1,D4
  2039.     subq.w    #1,D4
  2040.     asl.w    #3,D4        ; * 8=LMOV
  2041.     cmp.w    ?1(A0,D4.w),D0
  2042.     ble.s    SEYWMOVE?0    ; D0 <= v(LASTrec)
  2043. ;
  2044.     if ?1=0
  2045.     cmp.w    (A0),D0
  2046.     else
  2047.     cmp.w    ?1(A0),D0
  2048.     endif
  2049.     blt.s    SEYWMOVL?0
  2050.     clr.w    D1
  2051.     bra.s    SEYWMOVE?0    ; D0 >= v(FIRSTrec)
  2052. SEYWMOVL?0:
  2053.     clr.w    D3
  2054. SEYWMOVL1?0:
  2055.     move.w    D1,D2
  2056. SEYWMOVL2?0:
  2057.     add.w    D3,D2
  2058.     asr.w    #1,D2
  2059.     cmp.w    D3,D2
  2060.     beq.s    SEYWMOVE?0
  2061.     move.w    D2,D4
  2062.     asl.w    #3,D4        ; * 8=LMOV
  2063.     cmp.w    ?1(A0,D4.w),D0
  2064.     beq.s    SEYWMOV2?0
  2065.     bgt.s    SEYWMOVLT?0
  2066.     move.w    D2,D3        ; v(D2) > D0
  2067.     bra.s    SEYWMOVL1?0
  2068. SEYWMOVLT?0:
  2069.     move.w    D2,D1        ; D0 > v(D2)
  2070.     bra.s    SEYWMOVL2?0
  2071. SEYWMOV2?0:
  2072.     move.w    D2,D1
  2073.     addq.w    #1,D1
  2074. SEYWMOVE?0:
  2075.     endm
  2076. ;
  2077. SEWPEV0:
  2078.     move.w    (A1),D0        ; MPEV0 of White move
  2079.     SEYWMOV MPEV0
  2080.     rts
  2081. ;
  2082. SEWPEV:
  2083.     move.w    MPEV(A1),D0    ; MPEV of White move
  2084.     SEYWMOV MPEV
  2085.     rts
  2086. ;
  2087. SEYBMOV: macro
  2088. ; D0.w  EV* to be searched for
  2089. ; D1.w  MAXrecNR,    ALSO output-recnr
  2090. ; A0.l  STARTrecAD
  2091. ;
  2092. ; v(D3) <= v(D2) <= v(D1)
  2093. ;
  2094.     move.w    D1,D4
  2095.     subq.w    #1,D4
  2096.     asl.w    #3,D4        ; * 8=LMOV
  2097.     cmp.w    ?1(A0,D4.w),D0
  2098.     bge.s    SEYBMOVE?0    ; D0 >= v(LASTrec)
  2099. ;
  2100.     if ?1=0
  2101.     cmp.w    (A0),D0
  2102.     else
  2103.     cmp.w    ?1(A0),D0
  2104.     endif
  2105.     bgt.s    SEYBMOVL?0
  2106.     clr.w    D1
  2107.     bra.s    SEYBMOVE?0    ; D0 <= v(FIRSTrec)
  2108. SEYBMOVL?0:
  2109.     clr.w    D3
  2110. SEYBMOVL1?0:
  2111.     move.w    D1,D2
  2112. SEYBMOVL2?0:
  2113.     add.w    D3,D2
  2114.     asr.w    #1,D2
  2115.     cmp.w    D3,D2
  2116.     beq.s    SEYBMOVE?0
  2117.     move.w    D2,D4
  2118.     asl.w    #3,D4        ; * 8=LMOV
  2119.     cmp.w    ?1(A0,D4.w),D0
  2120.     beq.s    SEYBMOV2?0
  2121.     blt.s    SEYBMOVLT?0
  2122.     move.w    D2,D3        ; v(D2) < D0
  2123.     bra.s    SEYBMOVL1?0
  2124. SEYBMOVLT?0:
  2125.     move.w    D2,D1        ; D0 < v(D2)
  2126.     bra.s    SEYBMOVL2?0
  2127. SEYBMOV2?0:
  2128.     move.w    D2,D1
  2129.     addq.w    #1,D1
  2130. SEYBMOVE?0:
  2131.     endm
  2132. ;
  2133. SEBPEV0:
  2134.     move.w    (A1),D0        ; MPEV0 of Black move
  2135.     SEYBMOV MPEV0
  2136.     rts
  2137. ;
  2138. SEBPEV:
  2139.     move.w    MPEV(A1),D0    ; MPEV of Black move
  2140.     SEYBMOV MPEV
  2141.     rts
  2142. ;
  2143. SOMOV:
  2144. ; Sort moves
  2145. ; D6.w  MAXrecNR
  2146. ; A0.l  STARTrecAD
  2147. ; A4.l  SUBROUTINE-AD
  2148. ;
  2149. ; D0-D6 : temp. use
  2150. ;        |A0   |     |     |     |A1   |     |     | ... |#D6
  2151. ;        |A0   |     |     |     |A2   |A3   |-----
  2152. ;               #D1               #D5   (D0)
  2153. ;
  2154.     cmpi.w    #1,D6
  2155.     ble.s    SOMOVE
  2156.     subq.w    #2,D6
  2157.     move.l    A0,A1
  2158.     clr.w    D5
  2159. SOMOVL:    lea    LMOV(A1),A1
  2160.     addq.w    #1,D5
  2161.     move.w    D5,D1
  2162.     jsr    (A4)
  2163.     move.w    D5,D4
  2164.     sub.w    D1,D4
  2165.     beq.s    SOMOVN
  2166.     subq.w    #1,D4
  2167.     move.l    A1,A2
  2168. ;
  2169.     movem.l    D0-D1,-(SP)    ; save original D0-D1
  2170.     movem.l    (A2)+,D0-D1    ; save 8 bytes
  2171.     movem.l    D0-D1,-(SP)    ; at (SP)
  2172. ;
  2173. SOMOVR:    movem.l    -16(A2),D0-D1    ; get previous 8 bytes, order D0->D1
  2174.     movem.l    D0-D1,-(A2)    ; copy in order D1-D0, decr A2 by 8 bytes
  2175.     dbra    D4,SOMOVR
  2176. ;
  2177.     movem.l    (SP)+,D0-D1    ; now copy intended 8 bytes
  2178.     movem.l    D0-D1,-(A2)    ; to destination
  2179.     movem.l    (SP)+,D0-D1    ; restore original D0-D1
  2180. ;
  2181. SOMOVN:    dbra    D6,SOMOVL
  2182. SOMOVE:    rts
  2183. ;
  2184. MIQS:    macro    ; check pente solve/threat
  2185.     btst    #EVCbit5t,PMTQS(A3)
  2186.     bne.s    MIQSE?0        ; branch when already pente threat
  2187.     btst    #EVCbit5s,PIQS(A3)
  2188.     beq.s    MIQSE?0        ; branch when NO pente solve
  2189.     move.l    HMV0(A4),A0    ; now start filtering
  2190.     move.l    A0,A6
  2191. MIQSL?0:
  2192.     move.b    MTQS(A0),D0
  2193.     andi.b    #EVCs5t,D0
  2194.     beq.s    MIQSN?0
  2195.     move.l    (A0),(A6)+    ; copy pente solving move
  2196.     move.l    4(A0),(A6)+
  2197. MIQSN?0:
  2198.     lea    LMOV(A0),A0
  2199.     cmpa.l    HMV2(A4),A0
  2200.     bne.s    MIQSL?0
  2201.     move.l    A6,PGMVS(A3)
  2202.     move.l    A6,HMV2(A4)
  2203. MIQSE?0:
  2204.     endm
  2205. ;
  2206. ZEV:    ; White/Black Evaluation
  2207. ; assumption :
  2208. ; A4 : pointer to HST
  2209. ; A6 : pointer to MOVE
  2210. ; D0 : return-value = PEV
  2211. ;
  2212.     move.w    D0,HPEV(A4)
  2213.     move.b    HTQS(A4),PTQS(A3)
  2214.     move.b    MTQS(A6),D0
  2215.     move.b    D0,PMTQS(A3)
  2216.     btst    #EVCbit5t,D0
  2217.     beq.s    ZEVno_t
  2218.     andi.b    #EVCs5t,PTQS(A3)
  2219. ZEVno_t:
  2220.     move.b    MMEV(A6),HBMEV(A4)
  2221.     move.b    HBMEV-LHST(A4),HWMEV(A4)
  2222.     move.l    PGMVS(A3),A6
  2223.     move.l    A6,HMV0(A4)
  2224.     bsr    GMVS
  2225.     move.l    A6,PGMVS(A3)
  2226.     move.l    A6,HMV2(A4)
  2227.     cmpa.l    HMV0(A4),A6
  2228.     beq    ZEVnoMV
  2229.     tst.b    D0
  2230.     bmi    ZEVWIN
  2231. ;
  2232.     MIQS
  2233.     move.l    HMV0(A4),A0
  2234.     move.l    A6,D6
  2235.     sub.l    A0,D6
  2236.     lsr.w    #3,D6
  2237.     SOXPEVM    SEWPEV0
  2238. ZEVS:
  2239.     move.w    #ZCEVI,HCEV(A4)
  2240.     move.l    HMV0(A4),A6
  2241. ZEVL:    move.l    A6,HMV1(A4)
  2242.     bsr    EFMV
  2243.     movem.l    D4-D5/A4/A6,-(SP)
  2244.     lea    LHST(A4),A4
  2245.     move.w    HcolME(A4),D4
  2246.     move.w    HcolOP(A4),D5
  2247. ZEVNHST:
  2248.     move.w    HAEV-LHST(A4),D0
  2249.     neg.w    D0
  2250.     move.w    D0,HBEV(A4)
  2251.     move.w    HBEV-LHST(A4),D0
  2252.     neg.w    D0
  2253.     move.w    D0,HAEV(A4)
  2254.     move.w    MPEV0(A6),D0
  2255.     neg.w    D0
  2256.     MRECIPE
  2257.     movem.l    (SP)+,D4-D5/A4/A6
  2258.     neg.w    D0
  2259.     move.w    D0,MPEV(A6)
  2260.     bsr    EBMV
  2261. ZEVTEV:
  2262.     move.w    MPEV(A6),D0
  2263.     cmp.w    HCEV(A4),D0    ; HCEV <= HAEV <= HBEV
  2264.     ble.s    ZEVN        ; D0 <= HCEV ?
  2265.     move.w    D0,HCEV(A4)
  2266.     cmp.w    HAEV(A4),D0    ; test current-ev
  2267.     ble.s    ZEVN        ; D0 <= HAEV ?
  2268.     move.w    D0,HAEV(A4)
  2269.     cmp.w    HBEV(A4),D0    ; test beta-window
  2270.     bge.s    ZEVEF        ; D0 >= HBEV ?
  2271. ZEVN:    lea    LMOV(A6),A6
  2272.     cmpa.l    HMV2(A4),A6
  2273.     bne    ZEVL
  2274. ZEVE:    move.w    HCEV(A4),D0
  2275.     move.l    HMV0(A4),PGMVS(A3)
  2276.     rts
  2277. ZEVEF:
  2278.     addi.w    #ZBEV,D0    ; avoid false ties
  2279.     move.l    HMV0(A4),PGMVS(A3)
  2280.     rts
  2281. ;
  2282. ZEVWIN:
  2283.     move.w    HWIN(A4),D0
  2284.     move.l    HMV0(A4),A0
  2285.     move.w    D0,(A0)+        ; D0 --> MPEV0
  2286.     move.w    D0,(A0)+        ; D0 --> MPEV
  2287.     move.l    4-LMOV(A6),(A0)+    ; copy rest
  2288.     move.l    A0,HMV2(A4)
  2289.     move.l    HMV0(A4),PGMVS(A3)
  2290.     rts
  2291. ZQSWIN:
  2292.     move.w    HWIN(A4),D0
  2293.     move.w    D0,MPEV0-LMOV(A6)
  2294.     move.w    D0,MPEV-LMOV(A6)
  2295.     move.l    A6,HMV2(A4)
  2296.     move.l    HMV0(A4),PGMVS(A3)
  2297.     rts
  2298. ZEVnoMV:
  2299. ZQSnoMV:
  2300.     move.w    HPEV(A4),D0
  2301.     rts
  2302. ZEVesc:
  2303. ZQSesc:    add.w    PESC(A3),D0
  2304.     rts
  2305. ;
  2306. ZQS:    ; Z Quiescense Search
  2307. ; assumption :
  2308. ; A4 : pointer to HST
  2309. ; A6 : pointer to MOVE
  2310. ; D0 : return-value = PEV
  2311. ;
  2312.     move.w    D0,HPEV(A4)
  2313.     move.b    HTQS(A4),PTQS(A3)
  2314.     move.b    MTQS(A6),D0
  2315.     move.b    D0,PMTQS(A3)
  2316.     btst    #EVCbit5t,D0
  2317.     beq.s    ZQSno_t
  2318.     andi.b    #EVCs5t,PTQS(A3)
  2319. ZQSno_t:
  2320.     move.b    MMEV(A6),HBMEV(A4)
  2321.     move.b    HBMEV-LHST(A4),HWMEV(A4)
  2322.     move.l    PGMVS(A3),A6
  2323.     move.l    A6,HMV0(A4)
  2324.     bsr    GQS
  2325.     move.l    A6,PGMVS(A3)
  2326.     move.l    A6,HMV2(A4)
  2327.     cmpa.l    HMV0(A4),A6
  2328.     beq.s    ZQSnoMV
  2329.     tst.b    D0
  2330.     bmi.s    ZQSWIN
  2331. ;
  2332.     MIQS
  2333.     move.w    #ZCEVI,HCEV(A4)
  2334.     btst    #EVCbitn,PTQS(A3)    ; check normal moves generation
  2335.     bne.s    ZQSEVI
  2336.     move.b    PMTQS(A3),D0        ; check previous move's threats
  2337.     andi.b    #EVCQSI,D0
  2338.     bne.s    ZQSEVI
  2339.     move.w    HPEV(A4),HCEV(A4)
  2340. ZQSEVI:
  2341.     move.l    HMV0(A4),A6
  2342. ZQSL:    move.l    A6,HMV1(A4)
  2343.     bsr    EFQS
  2344.     movem.l    D4-D5/A4/A6,-(SP)
  2345.     lea    LHST(A4),A4
  2346.     move.w    HcolME(A4),D4
  2347.     move.w    HcolOP(A4),D5
  2348.     move.w    HAEV-LHST(A4),D0    ; negate ALFA
  2349.     neg.w    D0
  2350.     move.w    D0,HBEV(A4)
  2351.     move.w    HBEV-LHST(A4),D0    ; negate BETA
  2352.     neg.w    D0
  2353.     move.w    D0,HAEV(A4)
  2354.     move.w    MPEV0(A6),D0
  2355.     neg.w    D0
  2356.     MRECIPE
  2357.     movem.l    (SP)+,D4-D5/A4/A6
  2358.     neg.w    D0        ; negate return-value
  2359.     move.w    D0,MPEV(A6)
  2360.     bsr    EBQS
  2361. ZQSTEV:
  2362.     move.w    MPEV(A6),D0
  2363.     cmp.w    HCEV(A4),D0    ; HAEV <= HBEV <= HCEV
  2364.     ble.s    ZQSN        ; D0 <= HCEV ?
  2365.     move.w    D0,HCEV(A4)
  2366.     cmp.w    HAEV(A4),D0    ; test current-ev
  2367.     ble.s    ZQSN        ; D0 <= HAEV ?
  2368.     move.w    D0,HAEV(A4)
  2369.     cmp.w    HBEV(A4),D0    ; test beta-window
  2370.     bge.s    ZQSEF        ; D0 >= HBEV ?
  2371. ZQSN:    lea    LMOV(A6),A6
  2372.     cmpa.l    HMV2(A4),A6
  2373.     bne    ZQSL
  2374. ZQSE:    move.w    HCEV(A4),D0
  2375.     move.l    HMV0(A4),PGMVS(A3)
  2376.     rts
  2377. ZQSEF:
  2378.     addi.w    #ZBEV,D0    ; avoid false ties
  2379.     move.l    HMV0(A4),PGMVS(A3)
  2380.     rts
  2381. end
  2382.